-
스프링 부트 2일차 - junit으로 단위 테스트, FetchTypePortfolio/Spring Boot 2019. 4. 1. 01:30728x90
https://github.com/young891221/Spring-Boot-Test
위 예제를 실행시키면서 테스트 해보려고 했으나 어김없이 에러 ㅡㅡ
Error:(38, 25) java: cannot find symbol
symbol: method builder()
location: class com.havi.domain.Book... 이런 에러가 매우매우매우매우 많이나옴 에러 자체의 표면적인 이유는 Book에 builder 메소드가 없다는 얘긴데..
에러 메시지 그대로 구글에 검색 결과
http://blog.devenjoy.com/?p=383
에서 하라는 대로 인텔리제이 Setting에서 Annotation Processors의 "Enable annotation processing"을 활성화 시켜 주었더니 해결됨.
책에는 일언 반구 말도 없다 ㅎ
--- 퇴근 후
책에 있는 4장의 간단한 웹 커뮤니티 프로젝트 진행중
이러한 Board 도메인의 코드가 있음.
package com.web.domain; import com.web.domain.enums.BoardType; import java.io.Serializable; import java.time.LocalDateTime; import javax.persistence.*; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @NoArgsConstructor @Entity @Table public class Board implements Serializable { @Id @Column @GeneratedValue(strategy = GenerationType.IDENTITY) private Long idx; @Column private String title; @Column private String subTitle; @Column private String content; @Column @Enumerated(EnumType.STRING) private BoardType boardType; @Column private LocalDateTime createdDate; @Column private LocalDateTime updatedDate; @OneToOne(fetch= FetchType.LAZY) private User user; @Builder public Board(String title, String subTitle, String content, BoardType boardType, LocalDateTime createdDate, LocalDateTime updatedDate, User user) { this.title = title; this.subTitle = subTitle; this.content = content; this.boardType = boardType; this.createdDate = createdDate; this.updatedDate = updatedDate; this.user = user; } }
책에도 나와있는 것처럼 3가지 부분에 핵심이 있는 것 같다.
1. @GeneratedValue(strategy = GenerationType.IDENTITY)
이 애너테이션은 해당 Column의 ID 기본키 값을 할당하는 것을 DB에게 위임하는 것이다. 보통 DB 쪽에서는 Primary Key로 1씩 증가하도록 할당을 해줄 것이다. 다만 이것을 스프링 부트 코드에서는 신경쓰지 않을 것이다.
2. @Enumerated(EnumType.STRING)
이 애너테이션은 스프링 부트 내에서는 Enum 타입이지만, DB에 저장할때는 String 타입으로 저장하겠다는 것을 명시해주는 것이다. BoardType.notice => "공지사항"
3. @OneToOne(fetch = FetchType.Lazy)
이 애너테이션이 젤 중요한 것 같다. 우선 이 애너테이션은 다음처럼 사용되었다.
@OneToOne(fetch = FetchType.LAZY) private User user;
Board의 필드중 User의 FK를 스프링 부트 코드 상에서 표현해주고 있다. 물론 스프링 부트 내에서는 User은 User 객체의 레퍼런스를 저장하겠지만, 실제 DB에 저장될 때는 User의 PK 값을 Board에서는 FK로 저장할 것이다.
여기서 포인트가 있는데 FetchType에는 여기서 사용된 LAZY가 있고, EAGER가 있다. 두 개의 차이 점은 EAGER 같은 경우 Board를 조회할때 User 객체도 같이 조회가 되는 반면, LAZY 같은 경우 Board를 조회할때 조회되는 것이 아니라, Board로 조회된 User를 실제 사용하려고 할때서야 비로소 User을 조회해온다는 차이점이 있다.
만약 Board를 조회하는데, 그때 구지 User을 사용하지 않는 경우가 많다면 LAZY로 지정하는게 좋다. 안그러면 쓸데없이 User을 계속 조회하는 오버헤드가 발생할 것이다.
반면 Board를 조회할때 반드시 혹은 대부분의 경우 User도 조회하게 되는 경우에는 EAGER로 하는 것도 괜찮을 것 같다고 생각된다. (다만, 이렇게 EAGER로 조회했을 때 불러온 User가 그 사이에 DB에서 변경되고, 그 User을 다시 DB에 저장하면 데이터의 정합성이 깨질 수도 있지 않나 생각해본다.)
* FetchType.LAZY vs FetchType.EAGER https://yellowh.tistory.com/126 이런 글도 있는데 여기서 추천하는 방법은 우선은 모두 지연로딩으로 구현하고, 애플리케이션 개발이 어느정도 완료 단계에 이르르면 필요한 곳만 즉시로딩으로 바꿔서 최적화 하라고 나와있다.
그냥 인프런에서 백기선님 강좌 2개 질러버림
책이 친절하지 않아서 강좌를 보는게 나을 것 같았음.
'Portfolio > Spring Boot' 카테고리의 다른 글
스프링 부트 11일차 - index 페이지, 파비콘, 템플릿 엔진, HtmlUnit, ExceptionHandler (0) 2019.04.16 스프링 부트 10일차 - ViewResolve, Static Resource, WebJar (0) 2019.04.15 스프링 부트 9일차 - Spring-Boot-Devtools, 스프링 웹 MVC (0) 2019.04.09 스프링 부트 8일차 - 스프링 부트 테스트 (0) 2019.04.08 스프링 부트 7일차 - 스프링 부트 Jar, SpringApplication, 로거 (0) 2019.04.07 스프링 부트 6일차 - 스프링 부트 내장 웹 서버, SSL/HTTP2 적용 (0) 2019.04.06 스프링 부트 5일차 - 스프링 부트 AutoConfigure (0) 2019.04.05 스프링 부트 4일차 - 스프링 부트 프로젝트 구조와 의존성 그리고 자동설정 (0) 2019.04.04 스프링 부트 3일차 - 인프런 강좌로 다시 시작 (0) 2019.04.03 스프링 부트 1일차 - 스프링 부트 시작 (0) 2019.03.31