@Entity를 붙이면 일어나는 일 - JPA 내부 동작 원리
·
Java
들어가며 지난 글에서는 JPA의 핵심 메커니즘인 영속성 컨텍스트(Persistence Context)에 대해 정리했다. 데이터가 메모리 상에서 어떻게 관리되고 플러시되는지를 이해했다면, 이제 근본적인 의문이 생긴다. 어떻게 @Entity 어노테이션 하나 붙였다고 DB와 연동될까?또한 우리는 흔히 스프링 데이터 JPA를 사용하며 인터페이스만 선언하고 구현체는 만들지 않는다. 그럼에도 save() 메서드는 동작한다. 이번 글에서는 어노테이션이라는 메타데이터가 컴파일과 런타임 과정을 거쳐, 어떻게 리플렉션과 프록시 기술을 통해 실제 DB 동작으로 이어지는지 그 내부를 파헤쳐본다. 어노테이션의 정체: 그냥 주석일 뿐이다어노테이션은 아무 의미 없는 주석과도 같다@Entity나 @Getter 같은 어노테이션을 붙이..
JPA 영속성 컨텍스트
·
Java
스프링 부트와 JPA를 사용하다 보면 개발이 편해진다. SQL을 직접 짤 필요도 없고, 그저 코드로 작성하면 데이터가 저장된다.MyBatis나 직접 SQL을 작성하던 시절에는 모든 것이 명확했을 것이다. INSERT 쿼리를 실행하면, 정확히 그 시점에 DB에 데이터가 들어갔다. 하지만 JPA는 다르다.분명 데이터를 수정했는데 update() 메서드를 호출하지 않아도 DB가 변경되고, save()를 호출했는데도 즉시 INSERT 쿼리가 나가지 않는다.이것을 이해하려면, 그리고 JPA를 이해하려면 영속성 컨텍스트를 알아야한다. 이번 글에서는 JPA가 왜 영속성 컨텍스트라는 중간 단계를 두엇는지, 이로 인해 얻는 이점은 무엇인지 알아보겠다. 영속성 컨텍스트란?해석하면 엔티티를 영구 저장하는 환경이다. JPA를..
[우아한테크코스] 출석부
·
Java
이번 스터디에서는 우테코 출석부 미션을 진행했다.기능 요구사항은 다음과 같다. 기능 요구 사항을 보았는데 어떻게 설계를 해야할지 감이 안잡혔다..일단 나름대로 기능 목록을 정리해보았다. 기능 요구사항도 많고 다른 고려사항도 많아서 일단 구현만 되게 목표를 잡았다.기존에 하던 mvc방식으로 설계를 하였다.다음과 같이 구조를 잡았다. 이제 구현해보자.중요하지 않은 코드와 이전에 진행했던 과제에서 중복되는 내용들은 생략하도록 하겠다. 전체 코드는 아래의 링크에 첨부되어있다.model 패키지AttendanceStatus클래스enum으로 구현하였다.출석, 지각, 결석 상태를 저장한다. Attendance클래스출석 기록 한 건을 나타내는 도메인 객체이다.생성자를 정적 팩토리 메서드로 구현하였다.날짜를 저장한다.출석..
[우아한테크코스] 로또
·
Java
이번 스터디에서는 우테코 로또 미션을 진행했다.자동차 경주 미션보다 기능도 많고 고려할 것들도 많았다. 기능 요구사항은 다음과 같다.이번에는 리드미에 나름대로 구현목록을 작성하고 체크하면서 구현하였다. 자동차 경주 미션과 마찬가지로 객체지향을 지키며 mvc패턴으로 구현해보았다.전체적인 설계는 다음과 같이 잡았다.이제 구현해보자.중요하지 않은 코드는 생략하도록 하겠다. 전체 코드는 아래의 링크에 첨부되어있다.model 패키지패키지 설계 중 모델 패키지에는 도메인의 핵심 모델을 담아야겠다고 생각했다. Lotto 클래스한 장의 로또를 나타내는 클래스 (6개의 숫자 포함)1부터 45중 6개의 숫자를 중복 없이 오름차순으로 멤버변수에 저장Lottos 클래스여러 장의 로또(Lotto)를 하나의 객체로 묶어 다룬다...
[우아한테크코스] 자동차 경주
·
Java
스터디에서 우테코 자동차 경주 미션을 진행했다.기능 요구사항은 생각보다 간단했다. 구체적인 요구사항은 다음의 링크에 정의되어 있다.https://github.com/woowacourse-precourse/java-racingcar-6 GitHub - woowacourse-precourse/java-racingcar-6Contribute to woowacourse-precourse/java-racingcar-6 development by creating an account on GitHub.github.com 크게 시간이 걸릴 것 같지는 않았다. 주어진 요구사항에 맞춰 바로 코드를 짜 보았다. Car 클래스package racingcar.domain;public class Car { private S..