본문 바로가기

전체 글

ModelMapper 사용 법 compile group: 'org.modelmapper', name: 'modelmapper', version: '2.3.5' ModelMapper 빈 등록 @Configuration public class AppConfig { @Bean public ModelMapper modelMapper(){ return new ModelMapper(); } } ModelMapper 자동 매핑 private final BoardRepository boardRepository; public List getBoardList(){ return boardRepository.findAll() .stream() .map(board->modelMapper.map(board,BoardDto.class)) .collect(Col.. 더보기
Query dsl 설정 및 테스트 🌱 Querydsl? 쿼리를 자바코드로 작성할 수 있게 도와주는 기술이다. Spring Data JPA로 해결하지 못하는 복잡한 쿼리/동적 쿼리를 해결할 수 있다. 자바코드로 작성하기 때문에 문법오류를 컴파일 시점에 잡아낼 수 있다. 🌱 build.gradle에서 Querydsl 설정 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.7' id 'io.spring.dependency-management' version '1.0.15.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" .. 더보기
Entity 올바른 수정은 무엇인가 ? 변경 감지(Dirty Checking 방식) 스프링에서 EntityManger의 주요 기능 중 하나로 Dirty Check가 있다. EntityManger는 현재 트랜잭션에서 영속성 컨텍스트에 포함되어 있는 Entity객체에 수정이 발생할 경우, 트랜잭션이 커밋되는 시점에 내부적으로 UPDATE 쿼리를 생성하여 전달한다. 기본적으로 EntityManager의 find()나 createQuery() 메서드를 통해 조회는 Entity 객체는 영속성 컨텍스트에 포함된다. 따라서, persist() 메서드를 명시적으로 호출하지 않아도 된다. 그러나, EntityManager는 준영속 상태(Detached)의 Entity에 대해서는 Dirty Check를 수행하지 않는다. 만약, 사용자가 폼 정보를 기반으로 새로.. 더보기
JPA 올바른 Entity 생성 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @Column(name = "id", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private String picture; @Enumerated(EnumType.STRING)// Enum타입 객체를 쓸때 활용! 반드시 String타입으로 바꿔주고 DB 필드에 널어주어야 한다! private Role role; public Member update(Stri.. 더보기
JPA 영속성 컨텍스트란? 영속성 컨텍스트란? 영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 영속성 컨텍스트의 특징 엔티티 매니저를 생성할 때 하나 만들어진다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다. 엔티티 저장 em.persist(member); 엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다는 의미! 엔티티 찾기 em.find(Member.class,id); EntityManager에서 find를 하면 먼저 1차캐시에서 조회를 한 후 값이 있으면 DB를 조회하지 않고 .. 더보기
JPA 영속성관리 , N+1 문제 발생 원인 및 해결방법 [JPA] N+1 문제 발생 원인과 해결방법 💡 원인 [JPA] 영속성 관리, 준영속 상태와 지연 로딩, N+1 문제 발생 원인 JPA를 사용하여 개발할 때, 성능상 주의해야 할 것이 N+1 문제이다. 📌 즉시 로딩과 N+1 일반적으로 제공되는 find() 메소드 등을 사용할 때는 jpa가 내부적으로 join문에 대한 쿼리를 만들어서 반환을 하기 때문에 즉시 로딩이 큰 문제가 없어 보이기도 합니다. 그러나 JPQL을 사용할 때, 문제가 발생합니다. JPA는 JPQL을 사용할 때는 글로벌 페치 전략을 참고하지 않고 오직 JPQL 만 사용하기 때문에, 즉시 로딩 / 지연 로딩 구분 없이 쿼리문만 따르게 됩니다. List classrooms = em.createQuery("select c from Classr.. 더보기
JAVA Stream을 이용해서 모든회원정보 추출 다음과 같은 코드는 rest api 를 작성한 코드입니다. @GetMapping("/api/v2/members") public Result memberV2(){ List findMembers=memberService.findMembers(); List collect=findMembers.stream() .map(m-> new MemberDto(m.getName())) .collect(Collectors.toList()); return new Result(collect.size(), collect); } @Data @AllArgsConstructor static class Result{ private int count; private T data; } @Data @AllArgsConstructor stat.. 더보기
JPA 연관관계 매핑 양방향 매핑 아래와 같은 관계를 가지는 두 TABLE이 있다고 하자. USER와 GROUP은 다대일 관계이고, GROUP에서 USER는 일대다 관계이다. 위 두 TABLE을 JPA에서 Entity로 Mapping할때 일대다 관계의 경우 여러 건과 연관관계를 맺을 수 있으므로, Collection을 사용해야한다. JPA는 List 포함 Collection, Set, Map 등을 지원 위 관계에서 USER, GROUP Entity 예시는 아래와 같다. @Entity public class User { @Id @Column(name = "U_ID") @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; .. 더보기