Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

이지은님의 블로그

250122 - Java Spring 기초: Web Application, Spring Boot와 Gradle(WAS, SSR, CSR, 어노테이션 등) 본문

TIL

250122 - Java Spring 기초: Web Application, Spring Boot와 Gradle(WAS, SSR, CSR, 어노테이션 등)

queenriwon3 2025. 1. 22. 21:35

 코드 문제풀이

[JAVA] 코드카타 - (46)~(50)

 

[JAVA] 코드카타 - (46)~(50)

문제 (46) : 숫자 문자열과 영단어네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임

queenriwon3.tistory.com

 

 

 

▷ 오늘 배운 것

오늘은 Spring 기초 2주차를 듣고 알게된 것을 정리하려고 한다.

 

<< 목차 >>

1. Web Application

1) Web Server

2) WAS(Web Application Server)

3) Web System

4) Servlet

5) 멀티 스레드(Multi Thread)

6) SSR(Server Side Rendering)와 CSR(Client Side Rendering)

2. 프레임워크와 라이브러리

1) 프레임워크

2) 라이브러리

3. 어노테이션

1) 어노테이션(Annotation)

2) Lombok

4. Spring Framework와 Spring Boot

1) Spring Framework

2) Spring Boot

3) JAVA 웹 기술 발전의 역사

5. 빌드 관리도구(Gradle)

 

 

 

 


 

1. Web Application

 

1) Web Server

Web Server란,

HTTP 기반으로 동작하며 정적 리소스(HTML, CSS, JS, 이미지 등)를 제공한다. 정적 리소스는 리소스가 이미 완성이된 채로 서버에 존재하여 원본 그대로 응답하는 데이터를 말한다.

 

대표적인 Web Server, NGINX, Apache 있다.

 

2) WAS(Web Application Server)

WAS(Web Application Server)란,

HTTP 기반으로 동작하며 웹 서버의 기능을 포함한다. 추가적으로 코드를 실행해서 Application 로직을 수행하고 DB와 상호작용하여 동적 컨텐츠를 생성한다.

 

대표적인 WAS Tomcat(Spring Boot 내장), Jetty, Undertow 있다.

 

Web ServerWAS(Web Application Server)의 차이점
  1. 실제로는 Web Server Application 로직을 포함할 있다.
  2. WAS Application 코드를 실행하는 더욱 특화되어 있다.
  3. Java에서는 Servlet Container 기능을 제공하면 WAS 이다.

 

 

3) Web System

WAS만 사용할 경우 서버 과부화가 생길 수 있고, 실행에 가장 중요한 아플리케이션 로직이 정적 리소스로 인해 수행되지 않을 수 있다. —> 장애 발생시 응답불가

 

따라서, 정적 자원을 따로 다루어줄 Web Server가 필요하다.

클라이언트 ➡️ Web Server(정적자원) ➡️ WAS(어플리케이션 로직) ➡️ DB

이렇게 구성할 경우 효율적으로 리소스를 관리 할 수 있게된다.

만약 정적 자원이 많이 사용된다면 Web Server를 ScaleOut해주면되고, 어플리케이션 자원이 많이 사용된다면 WAS를 ScaleOut해주면 된다.

 

또한 Web Server에 오류가 발생할 확률이 낮으므로 만약 WAS에 오류가 발생한다면 오류 화면을 제공이라도 해줄 수 있다. (WAS는 오류발생 확률이 높고, DB에 문제가 발생해도 오류가 발생할 수 있다.)

 

 

 

4) Servlet

Servlet이란,

 HTTP 프로토콜 기반 요청(Request) 및 응답(Response)을 처리하는데 사용되는 웹 애플리케이션 개발에 핵심기술 중 하나이다.

 

만약 HTTP 메서드 등으로 데이터 폼을 전송할때

HTTP 요청 메세지는

POST /api/users HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

userId=아이디&pssword=비밀번호

 

HTTP 응답 메세지는

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423

<html>
    <body>
        ...
    </body>
</html>

다음과 같이 전송하게 된다.

 

이때 서버는 다음과 같이 동작한다.

1️⃣ 서버와 TCP/IP 연결

2️⃣ HTTP Request Message 필요한 형태로 변환하여 읽기 (HTTP Method 및 URL, HTTP Header, HTTP Message Body)

3️⃣ 분석한 결과를 통해 프로세스 실행

4️⃣ 비지니스 로직 실행

5️⃣ HTTP Response Message 생성 (HTTP Start Line, Header 생성, HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답)

6️⃣ 응답 전달

7️⃣ 연결 종료

 

—> 하지만 Servlet을 지원하는 WAS을 사용하면 4️⃣ 비지니스 로직 실행 하나만 실행하면 된다.

 

Servlet 동작 순서
  1. WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성
    (HttpServletRequest request, HttpServletResponse response를 service()의 매개 변수로 사용)
  2. WAS는 만들어진 Request, Response 객체를 서블릿 컨테이너에 넘겨주며 ExampleServlet 객체 호출 (public class ExampleServlet extends HttpServlet 호출)
  3. ExampleServlet에서 비지니스 로직 처리
  4. 응답에 필요한 정보를 개발자가 입력
  5. WAS는 Response 객체 정보(개발자가 입력한 정보)로 HTTP 응답 메세지 생성

—> 따라서 개발자는 Request 객체에 있는 HTTP 요청정보를 꺼내 비지니스로직을 수행하고 이에 따른 응답을 HTTP 로 전달하면 된다.

 

 

각 Servlet은 Servlet Container가 생성하고 관리한다. 따라서 Servlet Container가 포함된 WAS가 종료될 때 Servlet도 함께 종료된다.

 

개발자가 직접 인스턴스화 하여 사용하는것이 아닌, 코드만 작성하면 서블릿 컨테이너가 생성한다.

다음과 같이 여러개의 ExampleServlet 생성하여 서블릿을 생성하기만하면 서블릿 컨테이너가 생성 관리해준다.

@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
	
	@Override
	protected void service(
		HttpServletRequest request,  // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
		HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
	) {
		// application logic
	}

}
@WebServlet(name="Example2Servlet", urlPatterns = "/example2")
// 위와 같은 코드

@WebServlet(name="Example3Servlet", urlPatterns = "/example3")
// 위와 같은 코드

@WebServlet(name="Example4Servlet", urlPatterns = "/example4")
// 위와 같은 코드

 

 

👉  Servlet Container가 하는 일
서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다. (Servlet 객체를 싱글톤으로 관리)
동시 요청에 대한 처리를 위해 Multi Thread를 지원한다.

 

👉 Q. 싱글톤이란?
A. 싱글톤은 객체를 하나만 생성하여 생성된 인스턴스를 공유하여 사용하는것을 의미한다. 특정 클래스의 인스턴스가 여러개 생성되지 않도록 하여 자원의 낭비를 방지하고, 인스턴스를 공유함으로써 상태를 일관되게 유지하기 위함이다. 하지만, 공유 변수 사용을 주의해야한다.

 

 

 

5) 멀티 스레드(Multi Thread)

클라이언트에서 Request가 전달되면 Thread가 할당된 후 Servlet 객체를 호출한다. 이후 사용한 Thread를 반환한다.

 

만약 단일 스레드로 다수의 클라이언트 요청이 들어오면 요청이 모두 사라질때까지 대기-> 작업수행-> 스레드 반환 작업을 순차적으로 반복해야한다. 이때, 중간 요청중 작업이 지연되거나 에러가 발생되면 나중에 들어온 요청이 time out된다.

 

그러나, WAS는 동시 요청에 대한 처리를 위해 Multi Thread를 지원하기 때문에 요청마다 새로운 스레드를 생성하는 방법으로 동시 요청을 해결할 수 있다.

단, 멀티스레드 사용시 Thread생성에 제한이 없어 생성비용이 높은 편이다. 동시에 많은 요청이 발생하면 리소스 부족으로 서버가 다운될수도 있다. Context Switching 비용도 발생된다. 싱글톤 객체의 사용(Servlet, Spring Bean)에 공유변수를 조심해야한다.

 

👉 Context Switching란?
Task1에서 2로 교체되는 시점마다 ask1이 Ready 상태로 돌아간다는 정보, 진행정보, Task2는 어디부터 작업을 시작하면 되는지에 대한 정보들을 로딩할 시간이 필요하게 된다. 이 순간의 시점이 바로 Context Switching이다.

 

👉 Thread Pool이란?
적정수의 스레드를 미리 생성하여 Thread가 필요할때 받아올 수 있고, 사용한 Thread는 반납할 수있는 곳이다. (Tomcat의 경우 최대 200개)
미리 어느정도 생성할지 성능테스트를 통해 적정수를 찾을 수 있다.
스레드의 최대 수를 너무 낮게 설정하면 응답에 지연이 발생하고, 너무 높게 설정하면 리소스 부족으로 서버가 다운될 수 있다.

 

 

 

6) SSR(Server Side Rendering)와 CSR(Client Side Rendering)

SSR(Server Side Rendering)이란,

서버에서 동적으로 HTML 만들어 클라이언트에게 제공하는 기술로 백엔드 개발자 영역에 속한다. Java에서는 JSP, Thymeleaf 대표적으로 사용된다.

 

장점
  1. 초기 페이지 로드 시 서버에서 완전히 렌더링된 HTML을 반환하여 첫 페이지 로딩이 빠르다.
  2. 검색 엔진 크롤러가 완전한 HTML을 즉시 수집할 수 있어 SEO에 유리하다.
    ex) 전자상거래 사이트, 뉴스 사이트
단점
  1. 모든 요청에 대해 서버가 페이지를 렌더링해야 하므로, 높은 트래픽 상황에서 서버의 부하가 크게 증가할 수 있다.
  2. 초기 페이지 이외의 페이지들도 렌더링 후 반환되기 때문에 속도가 느리다.
👉 SEO(Search Engine Optimization)
검색 엔진에서 상위에 노출될 수 있도록 최적화하는 과정을 말한다.

 

 

 

CSR(Client Side Rendering)이란,

웹 브라우저에서 자바스크립트를 사용해 동적으로 HTML을 생성해서 적용하는 기술로 웹을 모바일 앱 처럼 부분 부분 변경할 수 있게 해준다. 프론트엔드 개발자 영역에 속하는 React, Vue가 대표적으로 사용된다.

  1. HTML을 요청한다. 비어있는 HTML을 응답받는다. JS가 존재하는 주소 링크를 응답한다.
  2. 자바스크립트(클라이언트 로직, 렌더링 포함)를 요청한다.
  3. HTTP API 요청을 하고 화면에 필요한 데이터를 JSON 형태(JSON이 아니어도됨)로 응답받는다.
  4. 응답받은 JSON 데이터로 HTML을 동적으로 그린다.

 

장점
  1. 클라이언트 측에서 렌더링하므로 사용자 인터랙션(상호작용)에 빠르게 반응할 수 있습니다.
  2. 초기 로딩 후에는 서버와의 통신 없이 빠르게 페이지 간 전환이 가능합니다.
    ex) Google Map, SNS Application
단점
  1. 초기 로딩 시 필요한 모든 자바스크립트 파일을 다운로드하고 실행해야 하므로, 초기 로딩 시간이 길다.
  2. 검색 엔진 크롤러가 자바스크립트를 제대로 실행하지 못하면 SEO에 불리할 수 있다.

 

 

 

 

2. 프레임워크와 라이브러리

1) 프레임워크

프레임워크(framework)란?

소프트웨어 개발을 간편하게 만들기 위한 소프트웨어 개발 환경

애플리케이션을 개발할 때 전체적인 구조(frame)를 잡기 위해 사용하는 것이다.

 

장점
  • 개발 프로젝트에 일관된 구조를 제공하여 코드의 일관성과 가독성을 높여주며 팀 협업이 편해진다.
  • 기본적으로 필요한 기능과 도구를 제공하여 개발자들이 핵심 비즈니스 로직에 집중할 수 있다.
  • 보안 관련 기능을 기본적으로 제공하여, 보안 취약점을 방지하는 데 도움을 준다.
  • 통합된 테스트 환경과 도구를 제공하여 테스트를 쉽게 작성하고 실행할 수 있다.
  • 인기 있는 프레임워크는 방대한 커뮤니티 지원을 받으며, 다양한 문서를 활용할 수 있다.
단점
  • 프레임워크는 굉장히 복잡한 구조를 가지기 때문에, 처음 익히는 데 시간이 많이 소요된다.
  • 프레임워크의 새로운 버전이 기존 코드와 호환되지 않을 수 있다.
  • 정해진 규칙과 구조를 따르게 강제하여 자유롭게 변경하기 어려울 수 있다.

 

2) 라이브러리

라이브러리(Library)란?

애플리케이션 개발에 필요한 클래스, 함수 등을 모아 놓은 코드의 모음

 

장점
  • 개발자가 복잡한 코드를 직접 작성하지 않아서 개발 생산성이 높아진다.
  • 검증된 라이브러리는 테스트와 커뮤니티 지원을 통해 안정성과 품질이 보장된다.
단점
  • 라이브러리가 업데이트 되거나 지원이 중단될 경우 문제가 발생할 수 있다.
  • 버전 호환성 문제로 인해 다른 라이브러리나 기존 코드와 충돌이 발생할 수 있습니다.
  • 불필요한 기능을 포함한 라이브러리를 사용하면 비효율적이다.
  • 라이브러리의 내부 구현을 직접 수정하기 어려워, 특정 요구 사항에 맞게 조정하기 힘들 수 있다.

 

 

 

3. 어노테이션

1) 어노테이션(Annotation)

어노테이션(Annotation)이란,

코드에 메타데이터를 추가할 수 있는 기능을 제공하며 주로 코드에 특별한 의미를 부여하거나, 컴파일러와 런타임에 특정 동작을 트리거하기 위해 사용된다. 특정 코드를 사용하는 프로그램에게 정보를 제공하는 주석과 같은 역할을 한다.

어노테이션은 @ 기호로 시작하며, 클래스, 메서드, 변수, 매개변수, 패키지 등에 추가할 수 있다.

 

내장 어노테이션
@Override 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타낸다.
@Deprecated 해당 요소가 이상 사용되지 않음을 나타낸다. —> 사용시 컴파일 경고가 발생한다
@SuppressWarnings 컴파일러 경고를 억제한다.(거의 안씀)

 

 

2) Lombok

롬복(Lombok)이란?

보일러 플레이트 코드를 줄여주는 라이브러리로 자동으로 보일러 플레이트 코드를 생성하여 코드의 가독성과 유지보수성을 높여준다. 

Lombok은 어노테이션 기반으로 동작하며, 주로 컴파일 시점에 소스 코드를 변환하여 필요한 메서드를 자동으로 생성한다.

@Getter, @Setter 클래스의 모든 필드에 대한 getter setter 메서드를 자동으로 생성
@ToString - 객체의 toString() 메서드를 자동으로 생성한다.
- 기본적으로 클래스의 모든 필드를 포함하며, 특정 필드를 제외하거나 포맷을 지정할 수도 있다.
@EqualsAndHashCode equals() hashCode() 메서드를 자동으로 생성한다. 객체의 동일성과 해시코드를 정의하는데 사용한다.
@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor 기본생성자를 생성한다( 순서대로 파라미터가 없는 기본 생성자, 전체 파라미터를 포함하는 생성자, final 필수 필드를 포함하는 생성자 생성)
@Data @Getter, @Setter, @ToString, @EqualsAndHashCode,@RequiredArgsConstructor 한꺼번에 적용하는 어노테이션 (테스트용도로 사용되며 실무에서는 거의 사용하지 않는다)
@Builder 빌더 패턴을 적용해 객체를 생성할 있게 합니다. 복잡한 객체 생성에 유용하며, 필드 이름을 명시적으로 지정하면서 객체를 생성할 있다.
@Slf4j 클래스에 로그를 남기기 위한 Logger 객체를 자동으로 생성한다.

 

@Builder 예시코드
@Builder
public class User {
    private String name;
    private int age;
}

User user = User.builder()
                .name("John")
                .age(30)
                .build();

 

@Slf4j 예시코드
@Slf4j
public class UserService {
    public void logMessage() {
        log.info("This is a log message");
    }
}

 

 

 

4. Spring Framework와 Spring Boot

1) Spring Framework

스프링 프레임워크(Spring Framework) 

Java Application Framework로 엔터프라이즈 애플리케이션(대규모 서비스 어플리케이션) 개발에 주로 사용된다.

 

수백만명의 고객의 요청을 한꺼번에 처리하기 위해서는 서버의 성능, 신뢰성, 보안이 아주 중요하다. 하지만 이 모두를 고려하며 비즈니스 로직을 개발하는 것은 쉽지 않다. 이런 복잡한 부분을 해결해주는 개발환경을 제공해준다면 개발자는 비즈니스 로직에만 집중할 수 있게 된다. —> Spring Framework

 

Spring Framework 특징
  • 애플리케이션의 다양한 구성 요소를 유연하게 연결하고 관리할 수 있도록 해준다.
  • Spring Framework는 누구나 사용할 수 있는 오픈소스 이다.
  • 모듈화되어 있어 필요에 따라 특정 기능만 선택적으로 사용할 수 있다.
  • Java언어의 가장 큰 특징인 객체 지향 언어의 특징(캡슐화, 상속, 추상화, 다형성)을 살려낸 프레임워크이다.

 

2) Spring Boot

스프링 부트(Spring Boot)

Spring Framework를 기반으로 하여 간편하고 신속하게 애플리케이션을 개발할 수 있도록 도와주는 도구이다.

 

초기 스프링 프레임워크는 매우 복잡하여 여러가지 의존성관리와 서버 설정이 필요했다. 따라 최소한의 노력으로 스프링 애플리케이션을 쉽게 개발할 수 있는 방법이 필요했다.

 

Spring Boot의 특징
  • 자동 구성(Auto-configuration) 기능을 제공하여, 개발자가 복잡한 설정을 직접 처리할 필요 없이 기본 설정으로도 비즈니스 로직에 집중할 수 있게 해준다.
  • 내장 WAS(Tomcat)를 제공하여, 애플리케이션을 별도의 서버 설정 없이 바로 실행할 수 있다.
  • spring-boot-starter-web를 빌드 관리 도구에 추가하면 웹 애플리케이션에 필요한 모든 종속성과 설정이 자동으로 구성된다.
  • 라이브러리들의 버전을 명시하지 않아도 호환 가능한 버전들을 찾아 자동으로 설정해준다.

 

 

3) JAVA 웹 기술 발전의 역사

1️⃣ Servlet의 등장 (1997)

Java를 사용한 웹 개발의 시초로, 서버에서 동적으로 콘텐츠를 생성하기 위해 사용되었다. 클라이언트의 요청을 받고, 그에 대한 응답을 생성하는 기본적인 구조를 제공했다. 

하지만 코드의 복잡성이 있고 유지보수가 어렵다는 한계가 있었다.

 

2️⃣ JSP (JavaServer Pages) 도입 (1999)

JSP는 HTML 내에 Java 코드를 삽입할 수 있는 기술로, 웹 페이지를 더 쉽게 동적으로 생성할 수 있도록 도와주었다.

그러나 JSP 내에 비즈니스 로직을 분리할 수 없어 코드가 복잡하다는 한계가 여전히 존재했다.

 

3️⃣ Servlet, JSP 기반의 MVC 패턴 도입

MVC 패턴이 도입되면서, UI, 비지니스 로직, 데이터를 분리하여 개발하는 방식이 등장했다. Servlet은 주로 컨트롤러(비지니스 로직)로 사용되었고, JSP는 뷰(UI)를 담당하게 되었다.

이 방식의 등작으로 MVC 패턴은 웹 애플리케이션의 유지보수성과 확장성을 크게 향상시켰다. 하지만 여전히 개발자가 중복적으로 설정해야 하는 부분이 있었다.

 

4️⃣ MVC 프레임워크의 등장과 발전 (2000~2010)

Struts, Spring 등의 MVC 프레임워크가 등장하며, 웹 애플리케이션 개발이 더욱 구조화되고 효율적으로 변했다.

그중 Spring MVC는 단순하면서도 강력한 기능을 제공하여, Java 웹 개발의 표준으로 자리 잡게 되었다.

중복적으로 설정해야 하는 부분들을 프레임워크로 자동화 했다.

 

5️⃣ Annotation 기반의 Spring MVC(2007~현재)

Annotation을 통해 애플리케이션 설정의 복잡함을 줄여주었다.

 

6️⃣ Spring Boot의 등장(2014~현재)

Spring 프레임워크를 보다 쉽게 사용하도록 만든 도구로, 설정과 복잡한 초기 설정 작업을 자동화했다.

내장 Tomcat을 가지고 있다.

이를 통해 개발자들이 빠르게 애플리케이션을 개발할 수 있도록 도와준다.

 

7️⃣ 최신기술 동향 - Web Servlet

안정적이고 동기식 프로그래밍 모델을 기반으로 한 웹 애플리케이션 개발에 널리 사용된다.

 

 

 

5. 빌드 관리도구(Gradle)

Gradle이란,

Java와 유사한 문법 구조를 가진 Groovy기반의 스크립트 언어를 사용하며 다양한 소프트웨어를 빌드(Build)할 수 있는 유연한 빌드 자동화 도구이다.

 

빌드는 소스코드를 컴퓨터가 실행가능한 파일로 변환해주는 작업을 말하는데, java파일을 컴파일하여 의존성을 추가한뒤 패키징하는 방법으로 코드를 컴퓨터가 실행가능하도록 만든다.

 

과정을 빌드 자동화 도구가 라이브러리 관리, 테스트, 배포 등을 함께 지원한다.

 

 

Gradle 특징
  1. 유연성
    • 복잡한 빌드 시나리오를 처리할 수 있는 유연한 시스템 제공
    • 빌드 스크립트를 통해 다양한 빌드 작업을 정의하고 필요한 경우 커스터마이징
  2. 성능
    • Build Cache: 빌드 결과물이나 라이브러리 의존성을 캐싱하여 재사용
    • 점진적 빌드: 마지막 빌드 호출 이후 변경된 부분만 빌드. 변경되지 않은 부분은 캐시결과를 검색해 재사용
    • 데몬 프로세스: 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스. 초기 빌드 이후 빌드 실행시 초기화 작업 불가
  3. 멀티 프로젝트 빌드 지원
    • 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용할 수 있도록 함
  4. 설정 주입 방식
    • 필요한 설정을 직접 프로젝트에 주입하는 방식, 공통되는 정보는 묶어서 한번에 주입 가능, 프로젝트별로 설정을 다르게 주입 가능

 

실제 build.gradle 파일

 

 

의존성 설정: 라이브러리를 추가하는 시점을 설정할 수 있다.

  • Implementation: 컴파일, 런타임 시점 모두에서 사용한다.
  • compileOnly: 컴파일할 때만 사용되고 런타임 때에는 사용하지 않는다.
  • runtimeOnly: 런타임 때만 사용한다.
  • testImplementation: 테스트할 때만 사용한다.