목록전체 글 (84)
제리의 배움 기록
최근 spring boot 2.7 OSS EOL 이 예정되어 (Ends in 3 months and 4 weeks (18 Nov 2023) 3.1로 버전 업그레이드 작업을 하였습니다. 의존하는 라이브러리들도 함께 버전 업그레이드가 되었고, 그 과정에서 기존과 다르게 동작하여 대응이 필요한 것들이 있었습니다. 오늘은 그 중에 Hibernate6로 업그레이드되면서 기존에 mysql의 field function 사용에 오류가 발생한 케이스를 공유하고자 합니다. DB에서 데이터를 정렬해서 가져올때, 일반적으로 특정 칼럼의 오름차순/내림차순 혹은 어떤 연산을 하고 그 값을 기준으로 데이터를 정렬하는 방식을 많이 사용합니다. 하지만 실무 비즈니스 로직을 구현하다 보면 외부에서 이미 특정 정렬 기준을 세워놓고 해당 ..
요약 로컬 개발환경에서 docker로 mysql 컨테이너 생성하기 로컬 개발환경에서 도커로 db를 사용하면 좋은 점 대부분의 회사가 요즘은 MSA를 지향하면서 서비스별 프로젝트와 DB가 분리되어 있습니다. 로컬에서 개발환경을 셋팅할때도 각 서비스의 DB를 개별 컨테이너화 해서 사용하면 관리가 유용합니다. 특히나, 서비스별 사용하는 DB 버전이 다른 경우에도 서로간 충돌이 없는 점도 큰 장점입니다. 개인적으로 토이프로젝트나 학습을 위한 프로젝트를 진행할 때도 위와 같은 이점으로 서로간 종속성 없이 개발할 수 있습니다. 도커로 myql 셋팅하기 1. 도커 이미지 레시피 작성 도커 이미지 생성을 위한 레시피를 작성합니다. vi docker-compose.yml [참고] 서비스가 하나인 경우 Dockerfile..
16장 트랜젝션과 락, 2차 캐시 트랜젝션과 락 [트랜젝션 ACID] 트랜젝션은 ACID를 보장해야 한다. Atomicity(원자성) : 하나의 작업인 것처럼 모두 성공 or 모두 실패해야 한다 Consistency(일관성) : 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. Isolation(격리성) : 동시에 실행되는 트랜젝션들이 서로에게 영향을 미치지 않도록 격리한다. Durability(지송성) : 트랜젝션을 성공으로 끝내면 그 결과가 항상 기록되어야 한다.중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜젝션 내용을 복구해야 한다. [참고] MySQL 트랜젝션 격리 수준 [낙관적 락과 비관적 락] 낙..
15장 고급 주제와 성능 최적화 1. 예외처리 트랜젝션 롤백을 표시하는 예외 복구할 수 없는 예외 예외 처리를 해서 트랜젝션이 커밋되도록 시도하면 javax.persistence.RollbackException 예외가 발생한다. 예외 종류 // EntityManager.persist(..) 호출 시 이미 같은 엔티티가 존재할 경우 발생 javax.persistence.EntityExistsException // EntityManager.getReference(..) 호출 했는데 실제로 초기화할 시점에 엔티티가 존재하지 않으면 발생. refresh(..), lock(..)에서도 발생한다. javax.persistence.EntityNotFoundException // 낙관적 락 충돌 시 발생 javax.p..
13장 웹 애플리케이션과 영속성 관리 스프링 컨테이너의 기본 전략 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같음 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근 엔티티 매니저가 달라도 같은 영속성 컨텍스트를 사용하게 됨 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 달라진다. 스프링 프레임워크를 사용하면 @Transactional 어노테이션을 선언하여 트랜잭션을 시작함(AOP 방식) 대상 메서드를 호출하기 직전에 트랜잭션을 시작하고, 대상..
12장 스프링 데이터 JPA Spring Data JPA는 Spring Data 프로젝트의 하위 프로젝트 중 하나이다. Spring Data 프로젝트는 JPA, 몽고DB, NEO4j, REDIS, HADOOP, GEMFIRE 같은 다양한 데이터 저장소에 대한 접근을 추상화해서 개발자 편의를 제공하고 지루하게 반복하는 데이터 접근 코드를 줄여준다. 공통 인터페이스 기능 스프링 데이터 JPA는 간단한 CRUD 기능을 공통으로 처리하는 JpaRepository 인터페이스를 제공한다. interface SchoolRepository: JpaRepository { } 제네릭의 첫번째 인자로는 엔티티가 온다. 두번째 인자로는 엔티티의 식별자 타입이 온다. JpaRepository 인터페이스를 상속받으면 사용할 수 ..
10장 객체지향 쿼리 언어 객체지향 쿼리 특징 테이블이 아닌 객체를 대상으로 검색 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 종류 JDBC 직접 사용 : MyBatis와 같은 SQL 매퍼 프레임워크. 필요하면 JDBC를 직접 사용 가능 JPQL 특징 엔티티 매니저를 통해 JPQL을 실행한다. sql과 유사하지만 문법의 차이가 있다. sql과 달리 엔티티에 대한 질의를 작성한다. JPA는 jpql을 sql로 변환하여 DB에 질의한다. 1. 쿼리 작성 select 구문 구조 select [결과로 리턴할 엔티티 혹은 엔티티의 특정 필드] from [조회 대상 엔티티] where [조건] -- 아래는 옵션 groupby [그룹화할 기준] having [각 그룹에 대한 조건] orderby ..
9장 값 타입 JPA의 데이터 타입은 크게 엔티티 타입과 값 타입으로 분류 엔티티 타입 @Entity으로 정의 영속성 컨텍스트 내에서 식별자를 통해 지속적으로 추적가능한 객체 값 타입 단순히 값으로 사용하는 자바의 primitive type 이나 object type 식별자가 없음 값 타입은 3가지로 나눌 수 있다. 기본값 타입 (basic value type) 자바 primitive type wrapper class String 임베디드 타입 (embedded type) 컬렉션 값 타입 (collection value type) 임베디드 타입(복합 값 타입) 직접 정의한 임베디드 타입도 int, String 처럼 값 타입이다. 회원 엔티티의 명세가 다음과 같을때 회원은 다음 정보를 가진다. 이름, 집주..