Programming/Spring

Spring - MVC 기본 동작 원리

잇(IT) 2023. 6. 5. 01:39

1. 컨트롤러에서 리턴 값으로 문자를 반환하면 viewResolver가 화면을 찾아서 처리한다

2. 스프링 부트 템플릿엔진 기본 viewName 매핑

3. resources:templates/ + (viewName) + .html

 

1. 웹 브라우저에 요청이 들어오면 톰켓은 스프링 컨테이너에 해당 컨트롤러를 우선 찾아보고 없으면 resources에 있는 정적 파일을 찾아서 요청에 대한 응답을 보낸다.

 

- Controller

@Controller
public class HelloController {
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam("name") String name, Model model) {
 model.addAttribute("name", name);
 return "hello-template";
 }
}

- View

resources/templates/hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>

1. 웹 브라우저에서 요청을 하면 tomcat이 해당 controller를 찾고 해당 컨트롤러가 실행되면서 hello-template에 데이터를 전달한다.

2. 데이터를 전달 받은 hello-template.html은 전달 받은 데이터를 포함하여 화면으로 보여준다.

 

- @ResponseBody를 사용

1. HTTP의 BODY에 문자 내용을 직접 반환한다.

2. viewResolver 대신에 HttpMessageConverter가 동작한다.

3. 기본 문자처리 : StringHttpMessageConverter

4. 기본 객체처리 : MappingJackson2HttpMessageConverter

5. byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다.

 


 

1. 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계

2. 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정한다.

3. 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소를 사용한다고 가정한다.

 

- memberService가 스프링 빈으로 등록되어 있지 않으면, memberController에서 해당 객체를 생성하지 않고서는 사용할 수 없다.

 

- 스프링 빈을 등록하는 2가지 방법

1. 컴포넌트 스캔과 자동 의존관계 설정

2. 자바 코드로 직접 스프링 빈 등록하기

 

- 컴포넌트 스캔 원리

1. @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

2. @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

3. @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다. 

   1. @Controller

   2. @Service

   3. @Repository

 

- 생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 생성자가 1개만 있으면 @Autowired는 생략할 수 있다.

 

 

- 자바 코드로 직접 스프링 빈 등록하기

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
 	@Bean
 	public MemberService memberService() {
 		return new MemberService(memberRepository());
 	}
 	@Bean
 	public MemberRepository memberRepository() {
		return new MemoryMemberRepository();
 	}
}

 

- DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다

 

- 인터페이스를 사용하면 위와 같이 코드 의존하는 객체가 변경되어도 기존의 코드에서 변경되는 부분이 적어진다.

 

- 기존의 memory 객체를 사용하다가 jdbc 객체로 변경하게 되더라도 의존 관계이기 때문에 변경에 유리하다.

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (스프링 핵심원리 - 기본 편)

728x90