스프링부트는 어마어마하게 광범위하기 때문에 필요한것을 찾는 능력이 중요하다
spring.io에 들어가서 프로젝트에 스프링부트를 클릭, 런클릭, 2.3.1 버전클릭,
@GetMapping은 어떤 url로 접근할것인가를 지정해주는 어노테이션.
Ctrl + Shift 누르면 문장 이동가능
디비에 저장하기위해서는 레포지토리가 필요하다.
@Entitiy는 디비에 있는 테이블을 의미한다.
클래스가 디비에 있는 테이블을 의미한다.
데이터를 받아와서 처리해주는건 타임리프 탬플릿을 쓴다.
MVC- Model,View,Controller
예전에는 View,Controller가 같이 있었음 뷰는 화면과 관련된 일만, 비즈니스 서버 뒷단에 관련된 것은 컨트롤러가 함
ctrl + space 파라미터로 들어갈만한 것을 추천해준다
ctrl + p 함수 파라미터 정보를 보여준다
ctrl + alt + o 사용되지 않는 import를 지워준다
ctrl + alt + L 들여쓰기를 깔끔하게 해준다
ctrl + art + m extract method
ctrl + B : 해당 파일 이동
ctrl + e : 과거 히스토리
iter + tab : 리스트나 배열있을때 for문 자동완성
정적컨텐츠를 제외하면 두가지 방식이 있다고 보면됨
하나는 html으로 내리는 것, 하나는 api방식으로 데이터를 내리는 것
@ResponseBody
http 헤더 바디 부분에서 바디 부분에 데이터를 직접 넣어주겠다는 것
Ctrl + Shift + enter : 자동완성 기능
Json은 key, value로 이뤄진 형식
객체가 반환되면 스프링은 기본 디폴트가 json방식으로 데이터를 만들어서 http 응답에 반환
기존에는 ViewResolver가 동작했으나 @ResponseBody가 있으면 HttpMessageConvert가 동작함 이때 객체면 JsonConverter가 동작하고 문자형이면 StringConvert가 동작함.
객체를 json으로 바꿔주는 라이브러리는 크게 두가지가 있고
1. Jackson 2. 구글 지썬?이 있는데 스프링은 Jackson을 적용하고 있음.
컨트롤러: 웹 MVC의 컨트롤러 역할
서비스: 핵심 비즈니스 로직 구현
리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
도메인: 비즈니스 도메인 객체 ex)회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
Optional은 자바8에 들어간 기능인데 뒤에 메서드가 null일수 있기때문에 optional로 감싸서 반환하게 한다.
반환타입이 Optional이면 값을 꺼낼때 get을 통해서 꺼낼수 있다(좋은 방법은 아니다 테스트코드라 get으로 하는걸로)
shift + F6은 rename (근데 저의 노트북에서는 안되네요..)
모든 테스트는 순서와 상관없이 의존관계없이 메서드별로 따로 동작하도록 설계해야한다. 순서대로 실행되는것이 아니기 때문이다. 그래서 테스트가 끝날때마다 리포지토리를 지워주는 코드를 넣어야한다.
--> @AfterEach
TDD :테스트주도개발, 테스트를 먼저 만들고(틀) 구현클래스를 만드는 것.
변수 추출하기
맥 : Command + Option + V
윈도우, 리눅스 : Ctrl + Alt + V
메소드 추출하기
맥 : Command + Option + M
윈도우, 리눅스 : Ctrl + Alt + M
Ctrl + T : Update project from VCS
Ctrl + Alt + B : 구현체 들어가기
optional로 감싸기 때문에 ifPresent를 쓸수있음. 과거에는 ifnull로 표현했음
Alt + Insert : 코드 생성 (Getters, Setters, Constructors,hashCode/equals, toString)
MemberService에서 생성한 MemoryMemberRepository와 테스트 케이스에서 만든 MemoryMemberRepository는 서로 다른 객체라는 문제점이 발생한다. 그럴때는 MemberService에서 이 부분을 수정해준다.
//수정전
private final MemberRepository memberRepository = new MemoryMemberRepository();
//수정후
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository; //MemberService에서 직접 리포지토리를 생성하는게 아니라 외부에서 넣어주도록 한다.
MemberServiceTest 코드에서도
//수정전
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
//수정후
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
그러면 같은 MemoryMemberRepository를 사용할수 있다. (DI 개념)