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..
자바 enum 타입을 엔티티 클래스의 속성으로 사용할 수 있다.@Enumerated 애노테이션에는 두 가지 EnumType이 존재한다.EnumType.ORDINAL : enum 순서 값을 DB에 저장EnumType.STRING : enum 이름을 DB에 저장cs 예를 들어 enum이 다음과 같이 생겼다고 하자.enum Gender { MALE, FEMALE;}cs ORDINAL로 지정하고 gender 속성에 Gender.MALE 값을 셋팅하면 DB에 저장되는 값은 1이다.그럼 Gender.FEMALE 값으로 셋팅하면 어떻게 될까?Gender에 선언되어 있는 순서가 값이 되기 때문에 2가 DB에 저장된다.@Enumerated(EnumType.ORDINAL)private Gender gender;cs STR..
Attribute Converter에 대해서 알아보자.말 그대로 속성 변환기이다.다음 그림과 같이 엔티티와 DB 사이에서 동작한다.흔히 개발을 진행하다 보면 DB에는 코드성의 데이터가 쌓이게 된다. 가령 gender 컬럼에 존재하는 데이터가 (1 이면 남자) (2 이면 여자)와 같은 식이거나 은행 컬럼에 존재하는 데이터가 (1 이면 신한은행) (2 이면 국민은행)과 같은 경우이다.허나 웹 애플리케이션에서는 DB에 존재하는 1이나 2와 같은 코드성의 데이터를 화면에 출력하는 일은 거의 없을 것이다.화면상에서는 코드에 부여한 의미 있는 문자열을 보여줘야 한다.이런 경우 처리할 수 있는 방법은 entity의 속성에 저장되어 있는 integer 값을 if 조건으로 분기처리하는 방법이 있다.그렇지만 이와 같은 방..
JPA에는 두 가지 로딩 기법이 존재한다.즉시로딩과 지연로딩이라고 한다.이 두 개의 로딩 전략은 엔티티를 조회할 때 적용된다. update, delete, insert에는 로딩 전략 대상이 아니다. 즉시로딩은 뭔가?엔티티 매니저를 통해 엔티티를 조회하면 연관관계에 매핑되어 있는 엔티티도 함께 조회 지연로딩은 뭔가?엔티티 매니저를 통해 엔티티를 조회하면 연관관계에 매핑되어 있는 엔티티를 실제 사용할 때 조회 즉시로딩, 지연로딩에 대한 설명을 글로만 보면 이해하기 쉽지 않다.예를 들어 설명해보자. Member 엔티티 클래스, Phone 엔티티 클래스가 있다고 하자.이 둘은 서로 객체 연관관계 설정이 되어 있다. 아래와 같이 Member 테이블에 Phone 엔티티가 즉시로딩 전략으로 설정되어 있다고 하자.이와..
영속성 전이에 대해 이해하기 위해서는 영속성 컨텍스트의 선행 학습이 필요하다.영속성 컨텍스트가 뭔지 잘 모르겠다면 http://lng1982.tistory.com/273 페이지 읽기를 추천한다. (내가 쓴 글을 내가 추천하니 뭔가 이상하다.) 영속성 전이라는 용어가 다소 생소할 것이다.예를 들어 Member, MemberPhone 엔티티 객체가 존재한다고 하자.Member엔티티를 엔티티매니저를 통해 영속화하면 MemberPhone엔티티도 함께 영속 상태가 되는데 이를 두고 영속성 전이라고 한다. 이처럼 둘의 엔티티가 영속 상태가 되었다면 영속성 컨텍스트가 flush될 때 DB에 insert문이 전송된다. JDBC로 개발 했을 때에는 부모가 되는 Member 테이블에 insert를 먼저 하고 그 다음에 M..
What is the EntityManager?The EntityManager API is used to access a database in a particular unit of work. It is used to create and remove persistent entity instances, to find entities by their primary key identity, and to query over all entities. This interface is similar to the Session in Hibernate. 엔티티 매니저는 특정 작업을 위해 데이터베이스에 액세스 하는 역할을 가진 녀석이다.또한 엔티티를 데이터베이스에 등록, 수정, 삭제, 조회할 수 있다.엔티티와 관련된 모든 ..
What is the EntityManagerFactory?1. 엔티티 매니저 팩토리는 엔티티 매니저를 관리한다. > 이름 그대로 엔티티를 관리하는 관리자다. > 엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. (쉽게 말해서 JDBC의 Connection 객체로 생각하면 된다.) 2. 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다. > 애플리케이션에서 바라보는 DB가 한 개라면 엔티티 매니저 팩토리도 한 개이다. 3. 엔티티 매니저 팩토리는 여러 쓰레드가 동시에 접근해도 안전하므로 서로 다른 쓰레드 간에 공유해도 된다.테스트 코드를 통해서 엔티티 매니저 팩토리에 대해서 더 알아보자. 다음과 같이 @Per..