본문 바로가기

legacy

(151)
[JPA] 변경감지(Dirty Checking)과 병합(Merge) 영속성 컨텍스트에는 변경 감지(Dirty Checking)와 병합(Merge) 기능이 존재합니다. Entity의 필드값을 수정한다는 공통점이 있으나, 주의해야 할 차이점 또한 존재합니다. 이 글에서는 준영속 상태의 Entity에 접근하는 관점에서 설명합니다. 변경 감지(Dirty Checking) 변경 감지란 영속성 컨텍스트가 관리하는 영속 상태의 Entity의 필드 값을 수정합니다. (영속 상태라 함은 Entity가 식별자 값(ID)을 가지고 있음을 말합니다) 영속성 컨텍스트를 Flush하는 시점에 Entity와 SNAPSHOT을 비교하여 변경된 값을 추적합니다. 변경된 필드가 존재한다면 수정 쿼리를 작성하여 쓰기 지연 SQL 저장소에 보관하였다가 Flush 시점에 DB에 업데이트됩니다. 변경 감지..
[JPA] 비영속 엔티티 -> 영속 엔티티 변경 과정 (old1) EntityManager를 통해 비영속 상태의 Entity를 영속 상태의 Entity로 변경할 수 있습니다. 이때 사용되는 메서드는 merge()입니다. 그렇다면 비영속 -> 영속 상태로 변경하는 과정은 어떻게 될까요? 차근차근 알아봅시다. 준영속 상태 준영속 상태란 EntityManager가 관리하지 않는 Entity라고 생각하면 됩니다. 관리되지 않기 때문에 해당 엔티티의 값을 변경하더라도 DB에 반영되지가 않습니다. 준영속 상태의 특징은 다음과 같습니다. 비영속 상태에 가깝다 영속성 컨텍스트에 의해 관리되지 않으므로 1차 캐시, 쓰기 지연 SQL, 변경 감지 등을 지원하지 않습니다 식별자 값을 가지고 있다 준영속 상태가 되기 전에 영속 상태이었기 때문에 식별자 값을 가지고 있습니다. 이 식별자 값은..
[Spring-Error] java.sql.SQLException: Generated keys not requested. 원인 DB에서 기본키를 자동으로 증가하는 전략을 사용할 때, 서버에서 DB에 등록된 키를 가져오지 못해서 발생하는 오류 코드 public Long enrolBoard(BoardEnrolDto boardEnrolDto) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement stmt = connection.prepareStatement("INSERT INTO Board(title, name, content, created_date, view_cnt) VALUES(?, ?, ?, ?, ?)"); stmt.setString(1, boardEnrolDto.getTitle()); st..
[Spring] Builder 패턴을 사용해야 하는 이유를 알아보자 사건의 발달 게시판에 글을 작성하였을 때, 등록된 시간이 Timestamp 값을 사용하기 때문에 다음과 같이 출력되었습니다. MySQL에서 등록일(created_date) 필드를 TimeStamp 타입을 사용하였고, 자바에서도 TimeStamp 타입을 사용하여 값을 받았습니다. MySQL Board Class 게시판 글 조회 문제 해결 저는 "2023년 11월 04일 22시 08분"으로 출력을 원했기에 다음과 같이 코드를 수정하였습니다. Board Class TimeStamp -> String 타입으로 포맷팅을 하기 위해 SimpleDateFormat 클래스를 사용하였습니다. 또한 생성자로 필드 값을 먼저 설정한 후, 추가적으로 포맷팅 된 값을 저장해야 하기 때문에 Setter가 필요하게 된 상황이 되었..
[Spring] JdbcTemplate을 사용하여 DB에 저장할 때, 키(PK) 값 가져오기 원인 Repository를 테스트할 때 key 값에 null이 저장되어 있어 DB 조회가 불가능한 상황이다. DB DB의 키(PK) 값은 auto_increment 전략을 사용하고 있다. Application 시점에서는 DB에 값을 저장하더라도 키 값을 알 수가 없다. 이는 테스트 코드에서 DB에 정상적으로 저장됐는지 확인하는 과정에서 문제가 발생한다. Application jdbcTemplate.update("INSERT INTO Member(login_id, name, password) VALUES(?, ?, ?)",member.getLoginId(), member.getName(), member.getPassword()); JdbcTemplate을 사용하여 DB에 Member 객체를 저장하였다. T..
[Spring] Dependency 모음 Test에서 Lombok 사용 //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' MySQL runtimeOnly 'mysql:mysql-connector-java' Jdbc DataSource 사용하려면 필요 implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
[JPA] 준영속 상태 엔티티 -> 영속 상태 엔티티로 만들기, merge() (old2) 1. 비영속 상태의 엔티티 생성 영속성 컨텍스트(PersistContext)에 한 번도 저장된 적이 없는 Member를 생성합니다. EntityManager를 통해 persist를 하지 않았기 때문에 비영속 상태입니다. void test() { // member1 생성 Member member1 = new Member(); member1.setName("member1"); } 2. 비영속 상태 -> 영속 상태 EntityManager를 통해 Member를 persist하였습니다. 따라서 영속성 컨텍스트에 의해 관리되는 영속 상태의 엔티티가 됩니다. (DB에서 조회되지 않는다.) void test() { // member1 생성 Member member1 = new Member(); member1.setN..
[Kotlin] when문을 사용하여 다양하게 처리하기 코틀린에서 when절은 다른 언어에서 제공하는 switch-case문과 동일합니다.(코틀린도 제공) is 키워드와 in 키워드를 통해서 when문을 사용하는 코드를 알아봅시다. 기본적인 when문 코틀린도 다른 언어와 마찬가지로 switch-case와 동일한 기능인 when문을 제공합니다. -> 기준으로 왼쪽은 a에 해당하는 값이고 오른쪽은 왼쪽 값이 true인 경우 실행할 코드입니다. fun main() { var a: Int = 10 when(a) { 10 -> println("a = 10") else -> println("a != 10") } } in과 is를 사용하는 when문 in 키워드의 경우 when문에서만 사용할 수 있는 것이 아닌 if-else문 등 다양하게 사용할 수 있습니다. is 키..