본문 바로가기

분류 전체보기

(183)
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (2) 앞선 글에서, Spring boot 에서 Proxy 를 생성할 때에는 상속을 이용한다는 것을 알았습니다. 여기서 코틀린과의 문제가 발생합니다. 1. Data Class Data Class 는 코틀린에 있는 특별한 클래스입니다. 다음의 메서드들을 적절한 방법으로 구현하여 자동으로 생성해줍니다. equals() hashCode() toString() copy() 이 메서드들은 최상위클래스인 Object 클래스에 정의되어, 굳이 Data Class 가 아니더라도 사용할 수 있죠. 그럼 Data Class 가 재정의해주는 위 메서드들은 어떤 차이가 있을까요 ? 먼저 그냥 class 로 정의한 경우입니다. 두번째로는 data class 로 정의한 경우입니다. 정리해보면 다음과 같습니다. equlas() : 참조가..
코틀린과 Hibernate, CGLIB, Proxy 오해와 재대로된 사용법 - (1) 최근 입사한 회사에서는, 자바를 코틀린으로 바꾸는 작업이 한창입니다. 저도 회사에 입사하여 코틀린을 처음 써봤는데, 이전에 공부했던 Effective Java 에 나오던 내용들이 언어 자체로 내장되어 있어서 정말 좋은 언어라고 생각하고 매력을 느껴 즐거운 개발생활을 지내고 있었습니다. 이 글에서는, 코틀린과 스프링, JPA 를 사용하면서 겪었던 시행착오를 기록합니다. 1. CGLIB cglib 컴파일타임 이후 런타임에 클래스 or 인터페이스를 동적으로 상속하여 새로운 클래스를 (이걸로 proxy 객체를 만들게 된다.) 생성해주는 라이브러리 Spring 에서는 AOP 를 사용한 proxy 생성에서 공식적으로 이 라이브러리를 사용하고 있습니다. 2. CGLIB 구성 2-1. Enhancer Proxy 객체를..
JPQL - Select JPQL 을 쓸 때, 검색하는 방법을 알아보자. JPQL 은 객체지향적 쿼리기 때문에, 에플리케이션상의 무언가와 매칭되어야 한다. 그 무언가의 종류에는 다음과 같은 종류가 있을 수 있다. 엔티티 타입 임베디드 타입 스칼라 타입 이번 글에서는 다음 엔티티를 사용한다. @Entity @Getter @Setter public class JPQLMember { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne @JoinColumn(name = "JPQLTEAM_ID") private JPQLTeam team; } @Entity @Getter public class JPQLOrder { @Id @Gene..
JPQL JPA 에서는 여러가지 쿼리를 날리는 방법을 지원한다. JPQL JPA Criteria QueryDSL Native Query JDBC Api 직접 사용 (Mybatis, Spring JDBC Template 등) JPQL : 객체지향 SQL : Java Persistence Query Language 테이블이 아닌 객체를 통하여 검색을 해야한다. JPA 는 객체지향 ORM 이기 때문에. EntityManager 는 find() 를 통해서 객체를 편하게 검색해올 수 있다. 하지만 이는 문제가 있다. 조건이 포함되지 않은 검색이므로 불필요한 데이터를 가져와서 메모리 낭비가 발생한다. 규모가 커지면 이는 성능에 나쁜 영향을 미칠 수 있다. 따라서, 검색조건이 포함되고, 객체지향적인 쿼리가 필요하며 이것이 J..
Using Spring Boot [Build System ~ Auto-Configuration] Using Spring boot 해당 문서는 Spring boot 공식 문서를 읽고 공부한 내용입니다 원본은 아래의 링크를 클릭 ! Using Spring Boot Build Systems 의존성을 관리하고, MavenCentral 같은 중앙 저장소에서 이 종속성들을 publish 할 수 있는 빌드도구를 적극적으로 추천한다. Maven 과 Gradle 을 사용하는 것을 추천하며, Ant 를 사용할 수 있긴 하다. 스프링은 서로 호환성이 좋은 라이브러리의 세트를 제공한다. 또한 이 라이브러리들이 어떤 버전을 사용하면 좋은지 미리 모두 정의해두었다. 빌드도구들은 이 정보들을 쉽게 가져오게 도와주는데, 어떻게 도와주는지 알아보자. Maven Spring Boot Maven Plugin Documentation..
영속성 컨텍스트를 쓰면 좋은점 1차 캐시 1. 엔티티 매니저는 영속성 컨텍스트를 가지고, 영속성 컨텍스트는 1차캐시를 가진다. 2. 1차 캐시는 DB 에 영속화하고 영속화한 데이터를 꺼내오는 작업 사이의 캐시이다. 3. 1차 캐시는 영속성 컨텍스트에 @Id 로 지정한 값을 key, 그 객체 자체를 value 로 가지게 된다. 4. 두 존재 사이의 존재는 어디서든 (io 의 bufferedReader 같은 버퍼) 캐시역할과 버퍼역할을 할 수 있다. JPA 의 1차캐시에서도 마찬가지다. 5. 엔티티메니저는 보통 트랜잭션 단위로 생성하기 때문에, 영속성 컨텍스트 안의 1차캐시도 트랜잭션 단위로 생성되고 제거된다. 6. 영속 엔티티 객체의 동일성을 보장한다. System.out.println("====="); Member member1 = ..
Entity Manager, 영속성 컨텍스트 JPA 는 java 와 DB 사이에서 DB 의 데이터와 Java Application 의 객체를 연결시키는 ORM 기술이다. JPA 를 사용하기 위해서는 Xml 을 작성해야한다. META-INF/persistance.xml 로 위치는 고정이며, 아래와 같이 작성한다. 이는 보통 DB 마다 생성하게 된다. 우리는 에플리케이션 단에서 이 persistence unit 하나로 하나의 Entity Factory 를 만들 수 있다. Entity Manager DB 의 데이터들은 에플리케이션에서 Entity 라는 단위로 관리된다. JPA 는 하나의 요청마다 하나의 Entity manager 을 생성해준다. 이 Entity Manager 는 Entity 를 관리하는 일을 수행한다. JPA 의 모든 데이터 변경은 이 ..
Getting Started 사진이 깨지네요.. 사진이 포함된 글은 여기(클릭) 에서 볼 수 있습니다. Getting Started 공식문서가 소개하는 Spring Boot 의 목적 스프링 부트를 사용하면, 스프링을 이용한 개발을 빠르게 시작할 수 있다. 기본 설정으로 바로 사용하면 된다. (권장하는 방법, Be opinionated out of the box) 하지만 기본 설정과 다른 요구사항이 있다면, 빠르게 변경하여 사용하면 된다. 큰 프로젝트에서 비 기능적 특징들을 제공한다. (임베디드 서버, 보안, 측정, 헬스 체크, 외부 설정 등) 마지막으로 제일 중요한 것은, Spring 과 달리 코드 생성이나 XML 설정이 필요 없다. 시스템 요구사항 Java 8 버전 이상 Spring Framework 5.3.4 버전 이상. 빌드 ..