엔티티 설계 시 주의점 엔티티에는 가급적 Setter를 사용하지 말자 Setter가 모두 열려있는 경우, 변경 포인트가 너무 많아서 유지보수가 어렵다. 모든 연관관계는 지연로딩으로 설정하자 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다. 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다. @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야한다. (@XToMany의 경우는 기본이 지연로딩이다.) JPQL N+1 문제란? JPQL로 select o f..
@AllArgsConstructor, @RequiredArgsConstructor 사용 주의 @AllArgsConstructor @RequiredArgsConstructor @ToString public class User { public String id; public String password; } 위와 같이 User 클래스를 생성했다고 했을 때 보통 아래와 같이 코드를 작성합니다. public void addUser(String id, String password) { User user = new User(id, password); userRepository.save(user); } 생성자의 첫번째 자리에는 id, 두번째에는 password가 잘 들어갑니다. 이 후 요구사항의 변경으로 User의 ..
사용 배경 프로젝트를 진행하면서 스프링 스케줄러를 사용해 주기적으로 이용자들에게 이메일을 보내는 기능을 구현했었다. Scale Out 시, 서버의 수만큼 해당 job이 반복되는 이슈가 발생했다. 해당 이슈를 해결하기 위해 ShedLock을 사용했다. ShedLock 같은 잡을 수행하는 각각 다른 서버에서의 인스턴스 A,B가 있을 때 A, B 둘 중 하나가 수행하도록, 2개 이상의 서버에서 중복 수행을 방지하도록 Lock을 걸게하는 라이브러리 1. 테이블 생성 아래와 같이 lock을 저장하기위한 테이블을 만들어준다. CREATE TABLE shedlock ( name VARCHAR(64), lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked..