<aside>

Spring Boot 특징과 구조

</aside>

  1. 자동 설정 (Auto Configuration)

Spring Boot는 기본적인 설정을 자동으로 해줍니다. 예를 들어, Spring Boot는 application.properties 또는 application.yml 파일을 통해 데이터베이스 연결, 웹 서버 설정 등 여러 가지 설정을 자동으로 처리합니다. 덕분에 개발자는 필요한 의존성만 추가하면 대부분의 설정을 따로 하지 않아도 됩니다.

스프링 프레임워크를 쓴다면? https://github.com/Sunro1994/TravelMaker/blob/main/TravelMaker/src/main/webapp/WEB-INF/web.xml

  1. 임베디드 서버 (Embedded Server)

Spring Boot는 Tomcat, Jetty, Undertow와 같은 서버를 내장하고 있어 별도의 외부 서버 설정 없이 애플리케이션을 실행할 수 있습니다. java -jar 명령어만으로 애플리케이션을 실행할 수 있는 것이 큰 장점입니다.

  1. 애플리케이션 실행 (Main Class)

Spring Boot 애플리케이션의 실행은 @SpringBootApplication 어노테이션이 붙은 메인 클래스로 시작합니다. 이 클래스에서 SpringApplication.run()을 호출하여 애플리케이션을 실행할 수 있습니다.

  1. 스타터 의존성 (Starters)

Spring Boot는 다양한 스타터 의존성을 제공하여, 필요한 기능을 쉽게 추가할 수 있습니다. 예를 들어, spring-boot-starter-web은 웹 애플리케이션을 위한 기본 설정을 제공합니다. 이처럼 필요한 기능을 starter 의존성만 추가하면 자동으로 설정이 처리됩니다.

image.png

<aside>

Dispatcher Servlet (화면과 데이터 반환, 데이터 반환)

</aside>

  1. DispatcherServlet 으로 요청(HttpServletRequest)이 들어오면DispatcherServlet은 핸들러 매핑(Handler Mapping)을 통해 요청 URL에 매핑된 핸들러를 탐색한다.여기서 핸들러는 컨트롤러(Controller)를 의미한다.
  2. 이후, DispatcherServlet은 핸들러 어댑터(HandlerAdapter)로 컨트롤러를 호출한다.
  3. 핸들러 어댑터에 컨트롤러의 응답이 돌아오면 응답을 가공하여 DispatcherServlet에게 반환한다.
  4. 응답을 가공하는 방법뷰 형식으로 리턴하는 컨트롤러를 사용할 경우 뷰 리졸버(ViewResolver)를 통해 뷰(View)를 받아 리턴한다.뷰 없이 JSON만 리턴하는 경우에는 MessageConverter을 사용해서 Json을 body에 넣어 HTTP 응답을 리턴한다.

cf. MessageConverter란?

JSON 데이터를 HTTP 메시지 바디안에 직접 읽거나 쓰는 경우 사용함

사용 예시 :

@RestController를 이루는 어노테이션 @ResponseBody은 자바 객체를 json으로 바꾸는 역할을 하는데,

이때 @ResponseBody의 내부에서 HttpMessageConverter가 동작함

image.png

<aside>

Spring Context에서 @Bean을 생성하고 DI/IoC 하는 과정

</aside>

public class SingletonTest {

	private static ApplicationContext context;  
  
	@BeforeClass  
	public static void init() {  
		context = new ClassPathXmlApplicationContext(  
		"classpath:META-INF/spring/applicationContext.xml");  
	}  
  
	@Test  
	public void testInstances() {  
		FixedDepositController controller1 
		= (FixedDepositController)context.getBean("controller");
		
		FixedDepositController controller2 
		= (FixedDepositController)context.getBean("controller");
  
		assertSame("Different FixedDepositController instances", controller1,controller2);
	}
	...
}

컴포넌트 스캔

image.png

image.png

image.png

<aside>

Spring AOP 작동 방식

</aside>

Untitled

image.png

<aside>

Spring PSA 작동방식

</aside>

PSA

자세한 예시

ava로 DB와 통신을 구현하기 위해서는 먼저 DB Connection을 맺어야합니다. 그리고 트랜잭션을 시작합니다. 쿼리를 실행하고 결과에 따라 Commit 또는 Rollback을 하게됩니다. 마지막으로 DB Connection을 종료하며 마무리하게 됩니다. 이를 Java의 수도코드로 나타내면 아래와 같습니다.위 예제의 3번을 제외하고는 @Transactional에서 제어해주는 부분입니다. 3번은 우리가 직접 구현하는 비지니스 메서드가 될 것입니다.

public void method_name() throw Exception {
    // 1. DB Connection 생성
    // 2. 트랜잭션(Transaction) 시작
    try {
        // 3. DB 쿼리 실행
        // 4. 트랜잭션 커밋
    } catch(Exception e) {
        // 5. 트랜잭션 롤백
        throw e;
    } finally {
        // 6. DB Connection 종료
    }
}

만약 JDBC로 @Transactional이 되어있다면 아래와 같은 코드가 될 것입니다. 이것은 JDBC에 특화되어있는 코드입니다. 이 코드로는 JPATransactionManager는 이용할 수가 없습니다. 왜냐하면 JPA는 Connection을 직접관리하지 않고 EntityManager로 간접으로 관리하기 때문입니다. Hibernate 라면 Session으로 관리하죠. 변경을 위해서는 코드의 수정이 불가피한 상황입니다. 어떻게 해야 @Transactional 단일 어노테이션으로 JPATransactionManager도 사용할 수 있게 할 수 있을까요?