한이음 프로젝트 첫 글
·
프로젝트 및 컨퍼런스 회고/한이음 프로젝트
블로그에 글 작성하는 것 자체가 너무 오랜만이다. 왜 오랜만이냐면 일단 예전 국비 시절 잠깐 배운 스프링 + 인프런 강의로 살짝 맛 본 스프링부트 + 인프런 강의로 살짝 맛 본 JPA + 인프런 강의로 살짝 맛 본 리액트 실력으로 개발을 하고 있으니 뭔가 진짜 개발을 하기보다는 레퍼런스를 찾고, 오류 해결하는 시간이 더 길어서 진도가 너~~~무 느린 거에 비해 시간을 너무 많이 쏟고 있다. 게다가 방통대도 형성평가를 시작해서 최대한 하루에 하나씩 들으려하니 퇴근하고 나면 도저히 시간적 여유가 생기지 않는다. 여기에 런데이까지 더하면? 여기에 또 말해보카까지 더하면? 죽음이다 죽음. 아무튼 나를 모르는 누군가가 옆에서 힐끗 봤을 때 갓생을 사는 것처럼 보이지만 음... 뭔가 알맹이가 빠지고 얼레벌레 모든 ..
[SpringBoot] Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true 에러 해결
·
에러 해결
한이음 프로젝트의 변경사항이 생겨 프로젝트 이름과 경로를 변경하고 서버가 실행되나 테스트해봤는데 에러가 발생했다. *************************** APPLICATION FAILED TO START *************************** Description: The bean 'boardRepository', defined in com.salmal.board.repository.BoardRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration, could not be registered. A bean with that name ..
Query DSL - 정렬, 페이징, 집합
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 정렬 정렬 기준은 다음과 같다. 회원 나이 내림차순(desc) 회원 이름 오름차순(asc) 단, 회원 이름이 없으면 마지막에 출력한다. @Test public void sort() { em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.usern..
Query DSL - 결과 조회
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 결과 조회 fetch() : List 조회, 데이터가 없으면 빈 List 반환 fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 : NonUniqueResultException 발생 fetchFirst() : limit(1).fetchOne() fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount() : count 쿼리로 쿼리 변경해서 count 수 조회 fetchResults fetch, fetchOne, fetchFirst의 경우는 굳이 실행 안해봐도 어떻게 나오는지 알테니 fetchResults부터..
Query DSL - 검색 조건 쿼리
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 검색 조건 쿼리 코드로 먼저 확인해보자. @Test public void search() { Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) // .where(member.username.eq("member1"), member.age.eq(10)) 와 동일 .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } .select와 .from의 경우는 .selec..
QueryDSL - 기본 Q-Type 활용
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 기본 Q-Type 활용 Q 클래스 인스턴스를 사용하는 방법 별칭 직접 지정 QMember qMember = new QMember("m"); 기본 인스턴스 사용 QMember qMember = QMember.member; 기본 인스턴스는 QMember 클래스 파일에 가보면 아래 코드로 만들어져 있는 걸 확인할 수 있다. public static final QMember member = new QMember("member1"); 저번에 작성한 테스트 코드에 적용해보자. //QMember m = new QMember("m"); // 별칭 주는 방법 QMember m = QMember.membe..
Query DSL - JPQL vs QueryDSL
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. JPQL vs QueryDSL 엔티티 찾기 JPQL로 엔티티 하나를 찾아오려면 아래와 같이 작성하면 된다. @Test public void startJPQL() { // member1 찾기 String qlString = "select m from Member m where m.username=:username"; Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findMember.getUsername()).is..
Query DSL - 예제 도메인 모델
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 예제 도메인 모델 예제는 익숙하고도 간단한 Member와 Team이다. Member의 컬럼은 id, username, age, team이 있고 Team의 컬럼은 id, name, members가 있다. 둘의 연관 관계는 Member의 입장에서 보면 Member와 Team은 다대일이고, Team의 입장에서 보면 Team과 Member는 일대다이다. Member 클래스 어노테이션 @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of={"id", "username", "age"}) publi..
Query DSL - 스프링 부트 설정
·
공부/JPA
Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 스프링 부트 설정 application.yml 생성 및 설정 src/resources에 있던 application.properties 파일을 지우고 application.yml 파일을 생성 후 아래 코드를 작성한다. spring: datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true loggi..
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 앞에서 자주 좀 본 기능 같다. 하지만 기억에 잘 안 남는 거 보니 그다지 중요한 애는 아닌 거 같다. 강의에서도 말하길 이 기..