- Many To Many 는 사용하지마라 -> (일대다 다대일 로 풀어라)
- enum타입 사용시 @Enumerated(EnumType.STRING) 으로 사용해라
- 양방향 연관관계는 되도록 사용하지마라
- @Getter는 모두열어놓으면 편하다
- @Setter는 사용하지않는다. (Setter는 생성자 주입으로 풀어라)
- 값 타입은 변경이 되면 안되기 때문에 생성자 주입을 열고 기본생성자(protected)도 만들어주어야 한다. (new로 생성 불가)
- ddl로 생성되는 테이블들이 맞게 되는지 확인하고 정제하는 작업을 거쳐야 한다.
- 모든 연관관계( @XToOne )는 지연로딩으로 설정해라 (N+1문제 해결방법)
- 컬렉션을 사용할때는
private List<Order> orders = new ArrayList<>(); 선언과 동시에 초기화 시킨다 (null point exception 문제 해결)
- 컬렉션은 필드에서 바로 초기화하고, 수정은 하지 않는다.
- 서비스에서 리포지토리는 final로 선언하고 @RequiredArgsConstructor를 사용한다.
- 테스트시에 insert문이 나가지 않는다. 테스트는 트랜잭션을 롤백하기 때문이다. 그래서 insert쿼리를 보고싶다면 em.flush로 영속성 컨텍스트를 강제로 초기화시켜 보는 방법이 있다.
- 준영속 엔티티를 수정할때는 merge를 사용하지 말고 변경감지 기능을 사용해라. merge는 모든 데이터를 바꾼다.
- 컨트롤러에서는 어설프게 엔티티를 생성하지말고 서비스 계층에 값을 넘기는 설계가 좋다. 값이 많다면 DTO로 만들어라.
- Controller에서 Service를 부를때 파라미터로 Id만 넘기고, 트랜잭션이 있는 Service 계층에서 엔티티를 불러오고 로직을 수행해야한다.
- HashMap은 멀티쓰레드 환경에서 동시접근이 안되기 때문에 ConcurrentHashMap을 사용해라
- Long도 멀티쓰레드 환경에서 동시접근이 안되기 때문에 Atomic Long 을 사용해라
- css 파일 복붙해도 안먹힐땐 out 디렉토리를 삭제하고 서버를 다시띄워보자 (지워도 서버띄우면 다시 생성됨)
- api 요청과 응답은 절대로 엔티티를 그대로 받거나 보내면 안된다. 별도의 클래스를 통해서 DTO를 만들어야 한다.