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 객체로 변경하게 되더라도 의존 관계이기 때문에 변경에 유리하다.
출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (스프링 핵심원리 - 기본 편)
'Programming > Spring' 카테고리의 다른 글
Spring - Data JPA (0) | 2023.06.07 |
---|---|
Spring - 객체지향 설계 5원칙 SOLID (SRP, OCP, LSP, ISP, DIP) (0) | 2023.06.07 |
Spring - @RequestParam, @ModelAtttribute, WebDataBinder (0) | 2023.06.02 |
Spring - @RequiredArgsConstructor (0) | 2023.05.31 |
Spring - 스프링 MVC 구현하기(Mapper, @Valid, 등...) (0) | 2023.05.30 |