1번의 쿼리로 A라는 테이블의 데이터 100개를 가져왔다고 하자.헌데 N번의 쿼리가 더 날아가는 상황이 발생했다.내 의도는 한 번의 쿼리로 100개의 데이터를 가져오는게 전부인데 추가적으로 N번의 쿼리가 더 전송되는 문제이다. 이것을 JPA에서 N+1 문제라고 한다. 발생 케이스에 대해서 상세하게 알아보도록 하자.다음과 같이 owner, cat 테이블이 존재한다고 하자.두 테이블의 관계는 owner(1) --> cat(N) 관계이다. [테이블 구조]1234567891011121314151617create table owner ( id integer not null, name varchar(255), primary key (id)) create table cat ( id integer not null, n..
아래 이미지를 참고하자.메이븐의 Lifecycle, Phase, Goal, Plugin에 대해 설명해 주고 있다.[참고 이미지] https://i.stack.imgur.com/tp88Z.jpg LifecycleMaven에는 3가지 라이프사이클을 제공하고 있다.Clean lifecycle : 빌드된 결과물 제거Default/build lifecycle : 빌드 결과물 생성Site lifecycle : Java document 결과물 생성CI 툴을 이용하여 메이븐 빌드를 할 때 mvn clean deploy 와 같이 실행하면 빌드된 결과물을 제거하고 빌드 결과물이 생성된다. Phase라이프사이클의 단계를 의미한다.Phase는 의존관계를 가지고 있다. 예를들어 mvn package 를 실행하게 되면 packa..
https://github.com/namkyu/test_spring_cloud/tree/master/config-servicespring cloud config은 서버와 클라이언트로 나뉜다.서버에서는 각 클라이언트들의 설정 정보들을 관리하고 클라이언트는 자신의 설정 정보를 config 서버로부터 받아와 사용한다.이처럼 서비스와 설정을 분리하게 됨으로써 여러 가지 장점을 얻을 수 있다. (갑자기 관심사 분리라는 객체지향 기법이 생각난다.) - 설정 관리의 용이성 - 설정 변경으로 인한 빌드 및 배포 필요 없음 스프링 부트를 이용한 spring cloud config 서버 설정 방법pom.xml 파일1234 org.springframework.cloud spring-cloud-config-serverColo..
SQL Management 툴에서 DB접속 정보를 저장하는 방법에 대해서 알아보았다.자주 사용하지 않는 툴이라 귀찮아도 매번 서버 주소, 계정, 패스워드를 입력하였는데..이마저도 귀찮아졌다. 1.보기 > 등록된 서버 선택하면 다음과 같은 창이 나온다. 2.Local Server Groups 선택 > 오른쪽 마우스 클릭 > 새 서버 등록 선택 3.Local Server Groups 하위에 등록한 서버가 노출되게 된다.이후에는 서버 호스트, 아이디, 패스워드를 매번 넣지 않고 더블 클릭을 통해 DB에 접속할 수 있다.
Spring Cloud는 MSA를 신속하게 구축할 수 있는 도구를 제공한다.대표적으로 다음의 도구들이 사용되어 진다.12345Service registration and discoveryCentral configurationDynamic Load balancerCircuit Breakers기타 등등... 꽤 많다.cs Spring Cloud는 다른 오픈소스와 통합하여 보다 쉽게 사용할 수 있도록 커스터마이징 한 후 오픈소스화 하는 전략을 취하고 있다.123Service discovery : Netflix EurekaDynamic Load balancer : Netflix RibbonCircuit Breakers : Netflix Hystrixcs위의 Netflix에서 제공하는 오픈 소스를 Netflix ..
JPA에는 두 가지의 Lock을 제공한다. [낙관적락]트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하는 방법이다.이것은 데이터베이스가 제공하는 락 기능을 사용하는것이 아니라 JPA가 제공하는 버전 관리 기능을 사용한다.애플리케이션이 제공하는 락이다. 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌을 알 수 없다. [비관적락]트랜잭션의 충돌이 발생한다고 가정하고 우선적으로 락을 걸고 보는 방법이다.이것은 데이터베이스가 제공하는 락기능을 사용한다.대표적으로 select for update 구문이 있다. JPA에서는 @Version 애노테이션을 통해 낙곽적락을 제공한다.12@Versionprivate int version;cs테이블에 VERSION이라는 컬럼을 생성하고 엔티티 매핑 시 @Version..
대부분의 엔티티에는 @Id 애노테이션을 한 개 사용한다.하지만 테이블의 키가 복합키로 이뤄져 있다면 엔티티를 설계할 때에 이를 고려해야 한다.복합키 설정 방법은 두 가지가 있다. 12@Embeddable 이용하는 방법@IdClass 이용하는 방법cs 첫 번째 방법이 객체지향 방식에 가깝다고 한다.두 번째 방법은 DB 방식에 가깝다고 하는데 잘 와닿지는 않는다. @Embeddable 이용 방법다음과 같이 emp 테이블이 존재한다.emp 테이블의 키는 emp_name, emp_no 두 개의 복합키로 이뤄져 있다.123456create table emp ( emp_name varchar(255) not null, emp_no integer not null, name varchar(255), primary ke..
Querydsl은 오픈 소스 프로젝트이고 type-safe한 쿼리를 위한 Domain Specific Language이다. 왜 필요한가?SQL query는 문자이다.이는 type-check가 불가능하고 실행해 보기 전까지 작동여부 확인이 어렵다.만약 SQL이 class처럼 Type이 있고, Java코드로 작성할 수 있다면 좋지 않을까?SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크가 Querydsl이다.QueryDSL은 JPQL(HQL)을 type-safe하게 작성하기 위해서 만들어졌고 다음처럼 동작한다.1Querydsl -> JPQL -> SQLcs [Querydsl 테스트 버전]JPA : 2.1hibernate : 5.0.12Querydsl : 4.1.4cs Queryds..
실무에서 elasticsearch 와 연동해야 할 일이 생겼다.검색을 통해서 알아보니 Spring Data 프로젝트 하위에 Spring Data Elasticsearch 프로젝트가 존재했다.https://github.com/spring-projects/spring-data-elasticsearch그 외에 Elasticsearch와 연동 가능한 Java API가 있었지만 Spring Boot를 사용하고 있어 Spring Data를 선택하게 되었다.선택 이유는 Spring Boot + Spring Data Elasticsearch 통합이 쉽기 때문이다. 일단 ElasticSearch와 연동하기 위해선 설치 작업이 선행되어야 한다.개발 환경이 윈도우라서 난 윈도우 버전을 설치했다.다른 환경이라고 해서 딱히 설..
테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리이다.이게 뭔 말이냐 하면다음과 같이 테이블 명이 JPQL_PERSON 인 Person 엔티티 클래스가 있다.123456@Data@Table(name = "JPQL_PERSON")@Entityclass Person { ... }cs JPQL_PERSON 테이블의 데이터를 모두 추출하고자 할 때 SQL로 작성하게 되면 "select * from JPQL_PERSON" 처럼 될 것이다.그럼 JPQL을 이용하면 어떻게 작성되어야 할까?"select p from Person p" 처럼 하면 된다.이처럼 JPQL은 객체지향쿼리이기 때문에 엔티티 클래스를 기반으로 쿼리를 작성해야 한다. 한번쯤은 궁금해 할지도 모르겠다.왜? "select p from JPQL_PE..