개발46 싱글톤 LazyHolder 적용해보기 public class Main { public static void main(String[] args) { Obj.Method1(); Obj.Method2(); Obj.Method2(); Obj.Method1(); } } public class Member { private String name; private String text; public Member(String name, String text) { this.name = name; this.text = text; } } public class Obj { static class Inner{ private static final Member member = new Member("민정", "굿"); } private static Member newM.. 2023. 8. 3. spring-data-jpa Repository에서 Entity로 반환받는 이유 spring data jpa에서 Repository에서 Entity로 반환받는 이유가 궁금했다. 나는 MyEntity가 Entity이고, 아래와 같이 특정 컬럼만 조회해오기 위해서 인터페이스를 만들고 Repository에서 이 인터페이스로 응답을 받았다. public interface MySpecificColumn { String getUserName(); String getUserImg(); } public interface MyRepository extends JpaRepository { List findTop10ByOrderByUserIdAsc(); } 그런데 다른 사람들의 코드를 보니, 다들 Repository에서 List findTop10ByOrderByUserIdAsc(); 이런식으로 받아서 .. 2023. 8. 2. Entity와 DTO Controller에서 응답 객체나 요청 객체를 받을 때 Entity를 그대로 사용하는 것보다 DTO를 사용하는 것이 권장된다. 엔티티란, 도메인의 핵심 로직과 속성을 갖고 있고, 실제 DB의 테이블과 매칭되는 클래스이다. DTO를 사용해야 하는 이유 엔티티 내부 구현을 캡슐화할 수 있다. 위의 엔티티의 정의에 따라, 엔티티가 getter, setter를 갖게 된다면 controller와 같이 비즈니스 로직과 크게 상관없는 곳에서 자원의 속성이 실수로 변경될 수 있다. 또한 엔티티를 UI 계층에 노출하는 것은 테이블 설계를 화면에 공개하는 것과 다름없기에 보안적으로도 바람직하지 못하다. 화면에 필요한 데이터를 선별할 수 있다. 순환참조를 예방할 수 있다. JPA로 개발할 때, 양방향 참조를 사용하면 순환.. 2023. 8. 2. @Transactional 동작원리와 public method calls private method에서의 트랜잭션 적용 여부 @Transactional public Long postBookReview(Long bookId, Long userId, ReviewRequest reviewRequest, MultipartFile file) { /** logic **/ fileUpload(review, file); return reviewRepository.save(review).getReviewId(); } private void fileUpload(Review review, MultipartFile file) { String fileName = s3Service.uploadFile(file); review.setReviewImg(fileName); } 위와 같은 상황에서 fileUpload도 @Transactional에 포함될까 궁.. 2023. 8. 2. 연관관계 매핑된 Entity 생성하기 @Entity @Table(name = "bookmark") @Getter public class Bookmark { @Id @GeneratedValue @Column(name = "bm_id") private Long bookmarkId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "u_id") private User user; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "r_id") private Review review; } 이렇게 되어있는 상태에서 u_id와 r_id로 insert하고 싶다. 그런데 엔티티를 설계하려고 보면, User, Review와 같이 클래스 타입이라 u_id, r_id만.. 2023. 8. 1. JPA OSIV(Open Session In View)와 성능 최적화 spring.jpa.open-in-view=true 스프링에서는 OSIV가 기본적으로 켜져있다. OSIV ON DB 트랜잭션을 시작할 때 JPA 영속성 컨텍스트가 DB 커넥션을 가져온다. OSIV가 켜져있으면 @Transactional 메서드를 벗어나도 커넥션을 계속 유지한다. API 응답이 나가고 화면이 렌더링 될 때까지 영속성 컨텍스트를 유지한다. 그래서 View, Controller 단에서도 지연 로딩으로 데이터를 가져올 수 있다. 지연 로딩은 영속성 컨텍스트가 살아 있어야 가능하다. 너무 오랫동안 DB 커넥션을 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. 결국 장애로 이어진다. 하지만 지연 로딩을 적극 활용할 수 있다는 장점이 있다. OSIV OFF spri.. 2023. 7. 12. 이전 1 2 3 4 5 6 ··· 8 다음