Query DSL - Query DSL 설정과 검증
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. Query DSL 설정과 검증 build.gradle 설정 build.grable에 Query DSL 라이브러리 및 설정 추가 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' // querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 's..
Query DSL - 프로젝트 환경설정
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 프로젝트 환경 설정(springboot 2.7.2 기준) https://start.spring.io/ Build and run 설정 - IntelliJ IDEA로 변경 HelloController.class 생성 @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello!"; } } 확인 lombok 설정 - install lombok 설정 - Enable annotation processing
Spring Data JPA - 네이티브 쿼리
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 네이티브 쿼리 네이티브 쿼리는 JPA에서 제공하는 기능이며 일반적으로 우리가 사용하는 SQL을 사용할 수 있도록 해주는 기능이다. 가급적 네이티브 쿼리는 사용하지 않는 것이 좋다. 정말 최후의 수단으로.. 어쩔 수 없는 상황에만 사용하는 걸 권장한다. 스프링 데이터 JPA 기반 네이티브 쿼리 MemberRepository.interface @Query(value = "select * from member where username = ?", nativeQuery = true) Member findByNativeQuery(String username); MemberRepos..
Spring Data JPA - Projections
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Projections 이 기능은 약간의 도움이 될 때가 있어 앞 부분보다는 잘 듣는 게 좋다. 엔티티 대신에 DTO를 편리하게 조회할 때 사용한다. 예를 들면 Member 엔티티가 아니라 Member의 이름만 조회하고 싶을 때 유용하다. 인터페이스 기반의 Closed Projections UsernameOnly.interface public interface UsernameOnly { String getUsername(); } MemberRespository.interface List findProjectionsByUsername(@Param("username") Stri..
Spring Data JPA - Query By Example
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Query By Example Query By Example은 쿼리를 Example에 의해서 하겠다는 기능이다. 코드로 살펴보자. @Test public void queryByExample() { Team teamA = new Team("teamA"); em.persist(teamA); Member m1 = new Member("m1", 0, teamA); Member m2 = new Member("m2", 0, teamA); em.persist(m1); em.persist(m2); em.flush(); em.clear(); //Probe Member member = ne..
Spring Data JPA - Specifications(명세)
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 나머지 기능들 Specifications(명세) Query By Example Projections 네이티브 쿼리 나머지 기능들은 복잡도가 높지만 실무에서 그닥 필요하지는 않은 기능들이다. 그래도 개 똥도 약에 쓰려면 없다고, 알고 있으면 좋을 기능들이므로 이런 게 있구나 정도만 파악하면 될 것 같다. Specifications(명세) 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원한다. Criteria 앞에서 자주 좀 본 기능 같다. 하지만 기억에 잘 안 남는 거 보니 그다지 중요한 애는 아닌 거 같다. 강의에서도 말하길 이 기..
Spring Data JPA - 새로운 엔티티를 구별하는 방법
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 새로운 엔티티를 구별하는 방법 새로운 엔티티를 판단하는 기본 전략 식별자가 객체일 때 null로 판단 식별자가 자바 기본 타입일 때 0으로 판단 private long id; 일 때 long에는 null이 들어갈 수 없으니 0이 들어간다. Persistable 인터페이스를 구현해서 판단 로직 변경이 가능하다. Item.class @Entity @Getter public class Item { @Id @GeneratedValue private Long id; } ItemRepository.interface public interface ItemRepository extend..
Spring Data JPA - 스프링 데이터 JPA 구현체 분석
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 내부적으로 어떻게 동작하는지 알아보기 위해 구현체를 분석해보자. 구현체는 JpaRepository 인터페이스에 인터페이스 선언부 옆에 화살표 아래 버튼을 누르면 SimpleJpaRepository를 찾을 수 있다. @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation { //...생략 @Override public Optional findById(ID id) { A..
Spring Data JPA - Web 확장-페이징과 정렬
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Web 확장 - 페이징과 정렬 페이징 정렬 예제 MemberController.class @GetMapping("/members") public Page list(Pageable pageable) { // pageable 파라미터 정보 , Page 결과 정보 Page page = memberRepository.findAll(pageable); return page; } @PostConstruct public void init() { for(int i = 0; i < 100; i++) { memberRepository.save(new Member("user" + i, i))..
Spring Data JPA - Web 확장-도메인 클래스 컨버터
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Web 확장 - 도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩하는 기능이다. 도메인 클래스 컨버터 사용 전 MemberController.class @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member..
Spring Data JPA - Auditing
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Auditing 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 사용한다. 기본적으로 테이블을 생성할 때 등록일과 수정일 컬럼을 넣는다. 왜냐하면 운영할 때 기본적으로 추적이 쉽기 때문이다. 추가적으로 등록자, 수정자도 추가로 넣을 수 있다. 위의 등록일, 수정일은 거의 모든 테이블에 공통적으로 들어가 있는 컬럼으로 생각하면 된다.(등록자, 수정자는 필요 없는 테이블에선 추가하지 않는다.) 순수 JPA 사용 JapBaseEntity.class @Getter @MappedSuperclass public class JpaBaseEntity { @Column(..
Spring Data JPA - 사용자 정의 리포지토리 구현
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 사용자 정의 리포지토리 구현 사용자 정의 리포지토리 구현은 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하기에는 구현해야 하는 기능이 너무 많다. 그래서 그 중에 뽑아서 몇 개만 구현하고 싶거나, 혹은 JPA가 아닌 다른 Mybatis 등의 다른 리포지토리를 같이 쓰고 싶을 때 사용한다. 사용자 정의 리포지토리를 만드려면 일단 인터페이스 하나를 생성해야 한다. MemberRepositoryCustom.interface public interface MemberRepositoryCustom { List findMemberCustom(); } 그리고 이 인터페이스를 ..
Spring Data JPA - JPA Hint & Lock
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. JPA Hint & Lock JPA Hint JPA 쿼리 힌트(SQL 힌드가 아니라 JPA 구현체(하이버네이트)에게 제공하는 힌트이다.) 쿼리 힌트 사용 MemberRepositoryTest.class @Test public void queryHint() { Member member1 = memberRepository.save(new Member("member1", 10)); em.flush(); em.clear(); //Member findMember = memberRepository.findById(member1.getId()).get(); // 실무에서 get으로 바..
Spring Data JPA - @EntityGraph
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. @EntityGraph 연관된 엔티티들을SQL 한 번에 조회하는 방법이다. EntityGraph를 제대로 이해하려면 fetch join에 대해 자세히 알고 있어야 한다. 그래서 본론에 들어가기 앞서 fetch join에 대해 먼저 알아보자. fetch join MemberRepositoryTest.class // Member.class @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="team_id") private Team team; 지금 Member 기준에서 Member와 Team의 연관관계는 다대일이다. 그리고 연관 관계 ..
[프로그래머스_1] 폰켓몬 JAVA
·
알고리즘/알고리즘 풀이
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다. 홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있..