Everyday Dev System

스프링 및 스프링 부트 서버 동작 원리 본문

내배캠 주요 학습/Spring 입문

스프링 및 스프링 부트 서버 동작 원리

chaeyoung- 2023. 6. 16. 13:03

목차 : 

 

 

 

 

 

1. Spring과 Spring Boot 차이

Sprinb Boot는 Spring의 기존 .xml 설정 대신 @의 어노테이션을 기반으로 설정한다.

Spring 프레임 워크는 Apache Tomcat을 다운로드 받아서 직접 삽입이 필요하다.
Spring boot는 boot 의존성을 추가하면 설정이 끝난다.

Spring boot에 Apache Tomcat이 내장되어 있으므로 따로 설정하지 않아도 된다.


 

이때 Apache Tomcat은 동적 데이터를 처리하는 웹 애플리케이션(WAS) 이다.

웹서버는 정적인 데이터를 처리하는 서버

이미지나 단순 html 같은 정적인 리소스들을 전달하며 WAS만을 이용할 경우보다 빠르고 안정적으로 기능을 수행

WAS는 동적인 데이터를 위주로 처리하는 서버이다.
WAS(Web Application Server)는 동적 데이터를 처리하는 서버이다.

 

 


2. Lombok의 활용

1) @Setter & @Getter

기재 시에 Setter() , Getter() 메서드를 자동 생성

 

2) @NoArgsConstructor &  @AllArgsConstructor

기본 생성자 생성 , 모든 필드에 대한 생성자 생성

 

3) @RequiredArgsConctructor

요구되는 필드에 따른 생성자를 생성.

해당 필드에 final을 기재 필요

 

 


3. MVC 디자인 패턴

1) Controller는 ModelView사이 상호작용 조정, 제어하는 역할2) Model은 데이터와 비즈니스 로직을 담당. -> DB와 연동 /저장 / 조회 3) View는 사용자의 인터페이스를 담당, 사용자가 보는 화면이나 폼 등을 구현

Controller가 사용자의 입력을 받아서 Model에 전달하고 해당 결과를 바탕으로
View를 업데이트하고 해당 View를 Client에게 보여준다.

 

 


4. Spring MVC란?

Spring MVC는 중앙에 있는 DispatcherServlet이 HTTP 요청을 처리하기 위한

                         Front Controller 패턴을 중심으로 설계되어 있다.

Tomcat은 Web Application Server 이다.
Web Application Server는 Web Container 혹은 Servlet Container라고 칭합니다.

Servlet 이란? Java를 사용하여 웹 요청에 대한 동적인 처리를 수행하는 클래스

Web Server는 동적인 처리가 불가하여 WAS에게 동적 처리를 요청한다.
요청이 들어오면, Web Container가 URL 매핑을 통해 Servlet을 실행한다.
Tomcat 내부에서 Servlet 기술이 동작하고 있다고 생각하면 된다.

 

 


5. Front Controller 패턴

1. Client로 부터 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청을 분석한다.
2. Handler mapping에서 API path와 Controller 메서드가 매칭한다.
3. 매칭한 정보를 토대로 DispatcherServlet이 해당하는 Controller를 찾아 요청을 전달한다.
4. 결과를 처리하고 해당 결과를 Model에 담고, View에 대한 정보도 같이 담는다.
5. ViewResolver를 통해 View를 업데이트한다.
6. 업데이트된 최종 View를 클라이언트에 반환한다.

DispatcherServlet과 위와 같은 Front Controller 패턴에 의해서

요청을 전달받아 작업을 처리할 수 있다는걸 알 수 있습니다.

 

Front Controller 패턴을 통해 직접 Servlet을 하나하나 구현하지 않아도 간편하게 처리할 수 있게 되었다.

 

Controller는 나중에 3개 계층 분리를 하여 Controller , Service , Repository로 분리 할 예정이다.(10번 카테고리)

 

 

 


6. Json 형태로 반환하기

json은 Java Script에 있는 타입이므로, 자바 서버에서 읽을 수 없습니다.

1. String -> json 형태 만들어서 반환
2. 클래스 타입으로 반환
3. jackson 활용하기 
 - serialize 직렬화 
 - deserialize 역직렬화

코드 전체 보기 

더보기

1) String으로 json 형태 만들어서 반환

    @GetMapping("/json/string")
    @ResponseBody
    public String helloStringJson() {
        return "{\"name\":\"Robbie\",\"age\":95}";
    }

 

2) 클래스로 반환하기

Star 클래스에 getter() 메서드가 반드시 구현되어 있어야 한다.
스프링에서 내부적으로 자바의객체를 json 형태로 변환해준다.

 

    @GetMapping("/json/class")
    @ResponseBody
    public Star helloClassJson() {
        return new Star("Robbie",95);
    }
@Getter
public class Star {
    String name;
    int age;

    public Star(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Star() {}
}

 

3) jackson 라이브러리 활용하기

  • json 데이터 구조를 처리해주는 lib
  • spring 3.0.x 버전 이후로 해당 라이브러리 제공함. 그러므로 추가 설정 불필요

1) Object -> Json 변환하는 방법 (serialize 직렬화)

Star 클래스 내에 getter() 메서드 필요
객체의 멤버 변수명과 키값을 일치시켜야 함.

 

    Star star = new Star("Robbie", 95);

    ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
    String json = objectMapper.writeValueAsString(star);

    System.out.println("json = " + json);

 

2) Json -> Object 변환하는 방법 (deserialize 역직렬화)

기본 생성자 & (get OR set) Method 필요
객체의 멤버 변수명과 키값을 일치시켜야 함.
        String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String

        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper

        Star star = objectMapper.readValue(json, Star.class);
        System.out.println("star.getName() = " + star.getName());
        System.out.println("star.getAge() = " + star.getAge());

2023.06.13 - [내배캠 주요 학습/Spring 입문] - 자바 json 반환 및 변환하는 방법

 

자바 json 반환 및 변환하는 방법

더보기 https://github.com/Chaeyounglim/spring-mvc GitHub - Chaeyounglim/spring-mvc: it's practice for spring it's practice for spring. Contribute to Chaeyounglim/spring-mvc development by creating an account on GitHub. github.com 1. Json 형태로 반

cdev.tistory.com

 

 

 


7. @RestController 와 @Controller의 차이

@RestController => @Controller + @ResponseBody 를 뜻한다.

Controller에 해당하는 클래스 앞에 명시하면 된다.
@RestController 클래스 내에 메서드에는 @ResponseBody를 기재하지 않아도 자동으로 들어간다.
또한, @ResponseBody를 달아준 메서드는 View가 아닌 Data를 반환하는 메서드입니다.

2023.06.13 - [내배캠 주요 학습/Spring 입문] - @RestController 와 @Controller의 차이

 

@RestController 와 @Controller의 차이

1. @RestController 란? -> Controller + ResponseBody 클래스에 @RestController를 달아주면, 메서드별로 @ResponseBody를 각각 기재할 필요가 없습니다. ** html을 반환 할 경우에 @ResponseBody 미기재 데이터를 반환할 때

cdev.tistory.com

 

 

 


8. PathVariable , RequestParam , RequestBody

1. PathVariable
2. RequestParam (Query String 방식이라고 부름)
3. ModelAttribute (Query String 방식 활용)
4. RequestBody - body에서 json 타입으로 넘어올 때 사용

주의사항
@RequestParam과 @ModelAttribute 둘다 생략이 가능하다.
스프링에서 파라미터 타입이 원시 타입인 경우에는 
@RequestParam로 인식아니라면 @ModelAttribut로 간주합니다.

2023.06.13 - [내배캠 주요 학습/Spring 입문] - 스프링에서 클라이언트가 서버에 값을 전달하는 방식

 

스프링에서 클라이언트가 서버에 값을 전달하는 방식

- pathVariable 빼고 RequestParam, ModelAttribute는 어노테이션 생략 가능. 스프링에서 원시타입일 경우에는 @RequestParam가 생략, 그 외에 클래스 타입같은 경우에는 @ModelAttribute이 생략되어 있다고 자동으로

cdev.tistory.com

 

 

 


9. JDBC  활용하기

application.properties에 DB 설정 정보 추가
build.gradle에 JDBC 의존성과, Mysql 의존성 추가

2023.06.13 - [내배캠 주요 학습/Spring 입문] - 스프링 부트 JDBC 활용하기

 

스프링 부트 JDBC 활용하기

application.properties에 추가 spring.datasource.url=jdbc:mysql://localhost:3307/memo spring.datasource.username=root spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver build.gradle에 JDBC 의존성과, Mysql

cdev.tistory.com

 

 

 


10.  IoC와 DI (의존성 주입)

3 Layer Architecture - Controller , Service , Repository

IoC - 설계 원칙, 객체의 생성과 관리를 개발자가 아니라 프레임워크가 대신하는 것
DI - 디자인 패턴, 외부에서 객체를 주입받아 사용하는 것

[ 의존성 주입 방법 ]
  1) 필드를 통한 주입
  2) 메서드를 통한 주입
  3) 생성자를 통한 주입 -> 객체의 불변성을 지켜주므로 이 방법을 통상적으로 사용한다.

2023.06.13 - [내배캠 주요 학습/Spring 입문] - IoC와 DI(의존성 주입

 

IoC와 DI(의존성 주입)

Data를 전달해오는 방식이 변경된 경우에는 Controller DB랑 작업하는데에 코드 변경이 필요한 경우엔 Repository 비즈니스 로직 수정이 필요한 경우엔 Service IoC는 설계 원칙, DI는 디자인 패턴이다. 1.

cdev.tistory.com

 

 

 

 


11.  Bean 과 IoC 컨테이너

Bean은 Spring이 내부적으로 관리하는 객체
IoC Container는 관리되고 있는 객체들이 위치한 Container
일반 클래스를 Bean으로 등록하기 위해서 해당 클래스에 @Component를 기재해야 한다.

JdbcTemplate은 @Component를 달지 않아도 spring에서 Bean으로 관리한다.

Bean으로 등록된 것들을 주입하기 위해서는 @Autowired를 기재해야 한다.
그렇지만, 생성자 메서드가 한개일 경우에는 생략이 가능하다.

@Controller , @Service , @Repository 에 @Component가 달려있음.

2023.06.13 - [내배캠 주요 학습/Spring 입문] - @Service와 @Repository

 

@Service와 @Repository

1. @Service 란? - Controller와 Repository 사이에 있는 계층으로 비즈니스 로직 부분을 포함하는 Class입니다. Service 계층 역할을 하는 Bean Class -> @Service @Service에 @Component가 달려 있으므로, 스프링 내부에

cdev.tistory.com

 

 

 


12. ORM 과 JPA

ORM은 객체와 DB를 맵핑해주는 도구
ORM의 대표적인 기술이 JPA
JPA는 표준 명세, 이를 실제로 구현한 Framework중 Hibernate라는 구현체 사용

JPA는 애플리케이션 서버와 JDBC API 사이에서 동작된다. 

Entity Class에서 기본 생성자가 생성이 되어 있어야 한다.
오버 로딩된 생성자가 없을 경우는 자동으로 기본 생성자가 자동 생성된다.

2023.06.14 - [내배캠 주요 학습/Spring 입문] - ORM과 JPA 활용

 

ORM과 JPA 활용

1. ORM이란? - 객체와 DB를 맵핑해주는 도구. 2. JPA란? - 자바, ORM 기술의 대표적인 표준 명세 - ORM 기술 중에 가장 표준적인 기술 - JPA를 실제로 구현한 Framework 중 사실상 표준이 Hibernate이다. 스프링

cdev.tistory.com

 

 

 

 


13. 영속성 컨텍스트

Entity 객체를 효율적으로 관리하기 위해 만들어진 공간
영속성 컨텍스트에 접근하여 Entity 객체들을 조작하기 위해서 EntityManager를 사용하여 저장, 조회, 수정, 삭제 
EntityManager , EntityManagerFactory는 스프링부트가 내부적으로 자동 생성.

em.persist() -> Entity를 영속성 컨텍스트에 넣어준다.

1차 캐시


2023.06.14 - [내배캠 주요 학습/Spring 입문] - 영속성 컨텍스트

2023.06.14 - [내배캠 주요 학습/Spring 입문] - 영속성 컨텍스트 활용 - persist() , find() , remove()

 

영속성 컨텍스트 활용 - persist() , find() , remove()

1. 영속성 컨텍스트란? Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이다. EntityManager를 통해서 영속성 컨텍스트에 접근을 한다. em.persist(memo); -> 컨텍스트에 저장하고 싶은 Entity Clas

cdev.tistory.com

 

2023.06.14 - [내배캠 주요 학습/Spring 입문] - 영속성 컨텍스트의 기능 - 3가지

 

영속성 컨텍스트의 기능 - 3가지

1. 1차 캐시 2023.06.14 - [내일배움캠프 공부/Spring 입문] - 영속성 컨텍스트 활용 - persist() , find() , remove() 영속성 컨텍스트 활용 - persist() , find() , remove() 1. 영속성 컨텍스트란? Entity 객체를 효율적으

cdev.tistory.com

 

 

 

 

 

 

 

 

 

 

 


References : 

2023.06.13 - [내배캠 주요 학습/Spring 입문] - Spring Boot Controller 이론 및 실습

2023.06.13 - [내배캠 주요 학습/Spring 입문] - 1-9 : Spring MVC란 무엇인가?