스프링 스타터 사이트를 통해 쉽게 스프링 프로젝트를 생성하였다.
gradle project / intellij / java 11
Spring Web
template engines : 데이터를 받아 html 처리를 한다.
Lombok : 코드를 간소화해주는 라이브러리 (Refactoring, Logging)
client <--> server
브라우저가 클라이언트고, 스프링부트가 서버를 수행한다.
서버는 model , view, controller의 세가지 일을 한다. = MVC 패턴
정적콘텐츠
MVC와 템플릿 엔진
API
내장 톰켓 서버가 스프링 컨테이너에 해당 컨트롤러가 없는 것을 확인하곤 HTML 파일을 통째로 웹으로 보낸다.
스프링 컨테이너에서 @Controller를 찾고 return과 model을 viewResolver로 보낸다.
viewResolver에서 Thymeleaf 템플릿 엔진 처리 ( = HTML처리) 를 한다.
(Dependencies로 설치해둔 tymeleaf)
스프링 컨테이너에서 @Controller와 @ResponseBody를 발견한다.
@ResponseBody 어노테이션이 있어서 viewResolver를 사용하지 않고 HttpMessageConverter를 사용한다.
1) 문자를 return 한다면 StringHttpMessageConverter 가 동작하고
2) 객체를 return 한다면 MappingJackson2HttpMessageConverter 가 동작한다.
JSON으로 변환된 데이터가 웹 브라우저로 보내진다.
cotroller : 웹 mvc의 컨트롤러
service : 핵심 비즈니스 로직 구현
repository : 데이터베이스에 접근하여 도메인 객체를 저장하고 관리
domain : 비즈니스 도메인 객체
실습에서 사용할 DB : 메모리 기반의 데이터 저장소를 사용
데이터 저장소를 우선 정하지 않고 인터페이스로 구현 클래스를 변경할 수 있도록 설계한다.
Member : 회원 객체 ( id, name)
MemberRepository 인터페이스 (save, findById, findByName, findAll)
MemoryMemberRepository
지금까지의 코드가 정상적으로 작동하는지 테스트 코드를 작성해보았다.
MemoryMemeberRepositoryTest
예상 결과 B와 실제 결과 A를 아래 메소드들에 넣어 테스트할 수 있다.
( + @Transacntional 어노테이션 )
Assertions.assertEquals( A , B )
assertThar( A ).isEqualTo( B )
각각의 테스트 동작이 서로 의존성이 없도록 afterEach 메소드를 만들었다.
public void afterEach(){
repository.clearStore();
}
Optional findByName(String name);
optional로 감싸서 가져오는 것은 값을 가져올때 null을 처리하는 새로운 방법이다.
Member result = repository.findByName("milk").get();
get()은 optional을 한번 제거할 수 있다.