"김영한의 스프링 입문" 강의를 보며 생성한 아카이브
모든 사용자에게 동일한 정보를 제공하는 정적 (static) 콘텐츠이다.
/resource/static
에 생성한다.요청(Request)에 대한 처리 결과를 포함하여, 사용자 별로 다른 결과를 제공하기 위해 템플릿 엔진 (Template Engine)
을 사용하여 동적 컨텐츠를 생성할 수 있다.
/resource/template/
에 생성한다.템플릿 엔진 종류 중 하나로 이 repository에서는 Tymleaf
템플릿 엔진을 사용한다.
HTML (View) 상단에 <html lang="ko" xmlns:th="http://thymeleaf.org">
를 추가하여 Tymleaf
사용을 알린다.
Controller 임을 명시하기 위해서 @Controller
annotation 추가한다.
Controller 에서 리턴 값으로 반환한 문자를 통해 viewReslover가 View 를 찾아서 처리해준다.
Controller
// HelloController.java
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "ahakim");
return "hello";
}
}
GetMapping()
: 사용자가 요청하는 URL 을 지정한다.
model.addAttribute()
: View 에 전달할 데이터 추가
리턴 값 "hello"를 통해 viewResolver 가 /resource/template/hello.html
을 찾는다.
View
// hello.html
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${name}">Name</h1>
</body>
th:text="${name}"
: Controller 에서 받은 데이터를 사용한다.ResponseBody
annotation을 사용하는 경우 viewResolver
대신 HttpMessageConverter
를 통해 HHTP Body
에 문자 내용을 직접 반환한다.
StringHttpMessageConverter
: 문자열MappingJackson2HttpMessageConverter
: 객체 → JSON@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam(value = "name", required = false) String name, Model model){
model.addAttribute("name", name);
return "hello "+name;
}
JSON 형태로 반환
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name, Model model){
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello{
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
스프링 컨테이너(Spring Container) 가 관리하는 자바 객체
new
키워드를 통해 인스턴스화하는 객체와 다르게, 컨테이너의 관리를 통해 객체를 여러번 생성할 필요 없이 공용으로 사용 가능하다.@Service, @Repository, @Controller
annotation이 있으면 스프링 빈에 자동 등록된다.@Controller
public class MemberController { ... }
@Service
public class MemberService { ... }
@Repository //interface의 구현체에만 어노테이션 추가
public interface MemoryMemberRepository implements MemberRepository { ... }
@Autowired
스프링이 관리 하는 객체, 스프링 빈으로 등록하지 않고 본인이 직접 생성한 객체에서는 동작하지 않음
Field (필드)
@Controller
public class MemberController {
@Autowired private final MemberService memberService;
}
Setter
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService){
this.memberService = memberService;
}
}
Constructor (생성자)
객체가 생성되는 시점에 빈을 주입 → 의존성이 주입되지 않아 발생할 수 있는 NullPointException
방지
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
MemberService, MemoryMemberRepository 의 @Service, @Repository, @Autowired
annotation 제거
Configuration 파일을 생성하여 직접 등록
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
Optional (Java 8)
null
이 될 수도 있는 객체를 감싸고 있는 일종의 Wrapper Class 이다.