TIL(Today I Learned)
-
TIL 52th dayTIL(Today I Learned) 2021. 12. 13. 21:48
모든 연관관계는 지연로딩(LAZY)으로 설정(중요) 📌 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야한다. 연관된 엔티티를 함께 조회해야 하면 fetch join 또는 엔티티 그래프 기능을 사용한다. @xxxToOne(OneToOne, ManyToOne)으로 된 어노테이션은 default가 fetchType.EAGER로 설정되어있기 때문에 LAZY로 수동 설정해줘야한다.(주의) 즉시로딩(EAGER) 조회(로딩)하는 엔티티에 관련된 엔티티를 한번에 조회(로딩)하는 것을 의미 JPQL N+1 문제 연관 관계에서 발생하는 이슈로, 연관 관계가 설정된 엔티티를 조회..
-
TIL 51th dayTIL(Today I Learned) 2021. 12. 12. 15:52
Entity class에서 getter와 setter 가급적이면 setter는 public으로 설정하지 않는것이 바람직하다. 객체지향의 캡슐화 원칙 이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 메서드만 제공하는것이 이상적이지만, 실무에서 Entity 데이터를 조회하는 경우가 너무 많으므로 Getter의 경우 모두 열어두는것이 편리하다. Getter는 단순 조회 기능만 제공하기 때문에 아무런 영향을 주지 않는다. 하지만, Setter를 막 열어두면 가까운 미래에 엔터티가 도대체 왜 변경되었는지 추적하기 점점 힘들어진다. 따라서, 엔터티를 변경할 때는 Setter 대신에 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공하는것이 좋다. @GeneratedValue En..
-
TIL 50th dayTIL(Today I Learned) 2021. 12. 11. 17:42
@Transactionnal Test 케이스에 존재하면 테스트가 끝난 후에 롤백을 해서 DB에 남기지 않는다. 반복적인 테스트를 위해 @Rollback(false) transactional에 의해 롤백되는것을 막아주는 어노테이션 저장이 잘되는지 확인하는 목적 PersistenceContext 실제로는 DB에 저장하는것이 아니라 영속성Context를 통해서 Entity를 영속화한다는 의미이다. 따라서, 영속성컨텍스트를 통해 만들어진 데이터는 save한 데이터와 같게된다. 예) 아래 코드 자세한건 추후에 다루도록 한다. // JpashopApplicationTests assertThat(findMember).isEqualTo(member); // 결과 true springboot 라이브러리 세팅 스프링부트가..
-
TIL 49th dayTIL(Today I Learned) 2021. 12. 10. 12:23
HikariCP 데이터베이스와 커넥션풀을 관리해주는 기능 커넥션 풀 커넥션풀은 미래에 데이터베이스 요청이 왔을 때 더 좋은 성능으로 이용할 수 있도록 캐시를 유지관리해주는것을 의미 thymeleaf nature templates 마크업언어의 변경 최소화, 웹 브라우저에서 확인 가능 @Controller 스프링 MVC 컨트롤러로 인식 MVC에서 C를 담당 역할을 분담하므로써 대규모 프로젝트의 비용절약, 유지보수 비용 절약 등이 가능 사용자의 요청이 진입하는 지점 단지 요청만 받고 실질적인 서비스는 서비스(Layerd Architecture)에서 담당 사용자에게 View를 응답으로 보내줌. Model Model을 통해 데이터를 실어서 View에 넘길 수 있다. Model.addAttribute 스프링 부트 ..
-
TIL 47th dayTIL(Today I Learned) 2021. 12. 8. 22:20
리터럴 대체 - |...| 타임리프에서 문자와 표현식 등은 분리되어 있기 때문에 더해서 사용해야한다. 따라서 |...|를 사용하면 더하기 없이 편리하게 사용할 수 있다. 변수 표현식 - ${..} 모델에 포함된 값이나, 타임리프 변수로 선언한 값을 조회할 수 있다. 프로퍼티 접근법을 사용한다. item.getPrice() 내용 변경 - th:text 내용의 값을 th:text의 값으로 변경한다. 10000* 여기서는 10000을 item.price 값으로 변경한다. URL 링크 표현식 - @{...} th:href="@{/basic/items/{itemId}(itemId=${item.id})}" item.id값은 itemId에 넣어서 최종적으로 {itemId}에 넣어준다 URL 링크 표현식을 사용하면 경..
-
TIL 46th dayTIL(Today I Learned) 2021. 12. 7. 14:20
공개 HTML /resources/static 폴더에 HTML을 넣어두면, 실제 서비스에서도 공개된다. 서비스를 운영한다면 지금처럼 공개할 필요없는 HTML을 두는 것은 주의하자 부트스트랩 HTML을 편리하게 개발하도록 도와줌 intellij에서 부트스트랩이 적용이 안될 시 out 폴더를 삭제하고 어플리케이션을 재시작하면된다. thymeleaf |입력| -> || 안에 문자를 입력하면 조합을 전부 합쳐주는 기능을 한다. @{주소} -> 타임 리프 경로 설정 th:each를 이용해서 loop를 순회한 만큼 변수에 넣어줄 수 있다. ex) th:each="item : ${items}" //모델에 있는 items만큼 루프를 돌아서 item 변수에 집어 넣는다. th:text=""를 이용해서 text 출력 @P..
-
TIL 45th dayTIL(Today I Learned) 2021. 12. 6. 18:19
스프링 부트 정적 리소스 src/main/resources 경로 아래에 있는 정적 리소스를 제공한다. /static, /public, /resources, /META-INF/resources 리소스를 보관하는 곳이고, 또 클래스패스의 시작 경로이다. 따라서, 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공한다. 뷰 템플릿 동적인 HTML을 만들때 사용한다.(thymeleaf) 컨트롤러를 통해 호출한다. th:text="${data}" 와 같은 태그를 이용해서 동적으로 변하는 html을 생성할 수 있다. @Controller @Controller이면서 String으로 반환하는 메서드는 return 값이 논리뷰로 반환된다. void를 반환하는 경우 @Controller를 사용하고..