전체 글
-
Thymeleaf 문법 정리Thymeleaf 2021. 12. 21. 18:53
th:field, th:error🎈 th:field="{필드 이름}"을 선언하면 HTML이 렌더링될 때, id, name을 같은 값으로 처리해준다. 즉, `th:field="{name}"은id = "name" name = "name"`과 같다 //fieldError 메소드를 미리 선언해서 에러 발생 시 빨간색 테두리가 호출되도록 설정 //th:field 예시 //테두리 빨간색 Incorrect date //에러메시지 출력th:object🎈 th:object는 폼에서 서버단으로 값을 넘길 때 object에 지정한 객체에 값을 담아 넘겨줄 수 있다. 즉, 화면에서 선언한 객체에 접근할 수 있게 된다. //th:object 예시 th:each🎈 해당 객체에 담긴 값들을 콜렉션 형식으로 가져올 수 있다. //t..
-
th:replaceThymeleaf 2021. 12. 21. 00:01
th:replace th:replace는 fragment와 함께 쓰이며, fragment 파일 아래에 선언해놓은 html 파일이 치환되는 방식이다. //home.html 위 처럼 home.html에 th:replace를 선언하고 "fragments/header"를 선언해서 경로를 지정해 주면 "fragments/header" 경로에 위치한 파일이 치환되어 실행된다. 자주 사용되는 레이아웃을 적용시킬 때 사용하는 방식인데, 위와 같은 방식은 Include-style layouts 방식이고, old한 방식이며 비효율적이다. Hierarchical-style layouts 방식으로 레이아웃 치환을 더욱 효율적으로 처리할 수 있다. thymeleaf.org/doc/articles/layouts.html 경로에 ..
-
-
TIL 55th dayTIL(Today I Learned) 2021. 12. 17. 13:28
생성 메서드 구현 이유 클래스 안에 다양한 연관관계들이 존재할 때, 생성 메서드를 작성하는것이 좋다 WHY ? "생성하는 지점 변경해야할 시에 생성 메서드만 수정하면 되기 때문" mapToInt Collection의 합을 구하는 방법은 reduce와 sum이 있다. 단, Stream에서 sum()을 사용하려면 IntStream, LongStream, DoubleStream과 같은 기본형(Primitive Type) 특화 스트림을 사용해야한다. 그래서 보통 mapToInt, mapToLong, mapToDouble과 같은 메소드로 스트림을 변환시키고 사용한다. 아래는 예시 코드 //Order return orderItems.stream() .mapToInt(OrderItem::getTotalPrice) ...
-
TIL 54th dayTIL(Today I Learned) 2021. 12. 16. 15:24
비즈니스 로직 작성 Tip Data를 가지고 있는 class에 business logic을 설계하는것이 응집도에 좋다. Exception class 작성 Tip 에러 메시지와 원인을 파악하도록 Override Method를 작성한다. ex) //NotEnoughStockException public NotEnoughStockException() { super(); } public NotEnoughStockException(String message) { super(message); } public NotEnoughStockException(String message, Throwable cause) { super(message, cause); } public NotEnoughStockException(Th..
-
TIL 53th dayTIL(Today I Learned) 2021. 12. 14. 20:22
@Transactional JPA 데이터 변경 하는 서비스 클래스에 선언해줘야한다. @Transactional(readOnly = true) JPA가 트랜잭션을 읽는 기능만 수행한다. 반면에, 쓰기 기능이 있는 메소드에는 Transactional 어노테이션만 생성한다.(default 값이 false이기 때문) 생성자 주입 필드 주입, 수정자(setter) 주입, 일반 메서드 주입 등이 있지만 생성자 주입이 가장 이상적이다. 수정자 주입은 애플리케이션 실행 도중 변경할 가능성이 매우 희박하기 때문에 잘 사용하지 않는다. 또한 수정하지 않는 것이 더 좋다. 생성자 주입은 개발 중간에 변경할 일이 없기 때문에 좋다. 테스트 코드를 작성 할 수 있다. 의존 관계를 명확히 구분 할 수 있다.(어디에 의존하는지) ..
-
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..