일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ES
- cleancode
- Baekjoon
- database
- 프레임워크
- 읽기쉬운코드
- 애자일기법
- Elasticsearch
- 알고리즘
- 그리디알고리즘
- 그리디
- spring boot
- 애자일프로그래밍
- JPA
- 자바
- 코드
- 클린코드
- 개발자
- Java
- 애자일
- 스프링
- 엘라스틱서치
- 개발
- Spring
- 코딩테스트
- framework
- 백준
- API
- 코딩
- 데이터베이스
- Today
- Total
목록전체 글 (173)
튼튼발자 개발 성장기🏋️
플러시 flush는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 역할을 한다. 이 기능을 사용하면 다음과 같은 일이 일어난다. - Entity와 영속성 #2에서 알아봤던 것 처럼 변경 감지가 작동하여 스냅샷과 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티가 있을 때 수정 쿼리를 만들어 SQL 저장소에 등록한다. - SQL 저장소의 쿼리를 데이터베이스에 전송한다. 영속성 컨텍스트를 플러시하는 방법은 3가지가 있다. 1. em.flush()를 직접 호출한다. - 테스트나 다른 프레임워크와 JPA를 함께 사용할 때 외에는 거의 사용하지 않는다. 2. 트랜잭션을 커밋하여 플러시를 자동 호출한다. - 변경 내용을 SQL로 전달하지 않고 커밋하면 데이터베이스에 반영이 되지 않는다. - 꼭 커밋 전에 영속..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/2dsNm/btqOvQWmeFr/bcVqeCpV7kEBUpzstpkAJK/img.png)
그렇다면 영속성 컨텍스트가 왜 필요한지 알아보자. 엔티티 조회 영속성 컨텍스트는 내부에 1차 캐시라고 하는 녀석을 가지고 있다. 영속 상태의 모든 엔티티는 이 1차 캐시에 저장된다. 이해하기 쉽게 코드와 그림을 보자. Member member = new Member(); member.setId = "dotori"; em.persist(member); Member dotori = em.find(Member.Class, "dotori"); // 조회 1차 캐시 내에 @Id로 맵핑된 필드 값을 식별자를 가지고 엔티티가 저장된다. (아직 데이터베이스에 저장된 상태는 아니다.) 조회를 하게 되면 엔티티 매니저는 1차 캐시에서 해당하는 엔티티를 찾는다. 만약 1차 캐시에 없다면 데이터베이스에서 조회한다. (JPA란..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bK54aI/btqOtDp7MD0/WRcMMcy3LthiqTVgkUTW81/img.png)
JPA를 사용하기 위한 설정과 동작 원리에서 언급했던가? 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하기 때문에 서로 다른 스레드 간에 공유해서 사용이 가능 하지만 엔티티 매니저는 여러 스레드가 동시에 사용하게 되면 동시성 문제가 발생하여 스레드 간의 공유가 불가능하다. 영속성 컨텍스트 영속성 컨텍스트는 JPA를 이해하기에 가장 중요하다고 할 수 있다. 영속성 컨텍스트는 '엔티티를 영구적으로 저장하는 환경'이라고 정의되어 있으나 도통 이 말이 이해가되지 않는다. 말로 풀어서 이야기 한다면 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 데이터베이스가 아닌 어떠한 공간에 보관하고 관리하는데 이 공간이 영속성 컨텍스트다. 지금까지 살펴본 persist(member)의 메소드가 바로..
본 글은 소프트웨어 학습 태도를 읽고 참고하여 개인적인 생각과 경험을 바탕으로 작성한다. 1. 내가 걷는 속력과 방향을 인지하자. 개발은 혼자 하는 것이 아니다. 같은 팀원, 타 팀원, 그리고 관리자와 함께 진행한다. 이렇게 많은 사람들과 함께 업무를 진행하면서 각각 업무량도 다를 것이고 각자 일처리 속도와 습득속도 등 차이점이 있을 수 있다. 특히 일처리 속도에 대해서는 개발방향을 잘못 잡거나 필요한 기술 학습에 대해 잘못 접근하는 등에 이유로 인해 필요 이상으로 시간을 낭비할 수도 있다. (물론 언젠가는 도움이 될 수도 있겠지만 당장 처리해야하는 업무 관점에서 볼 때는 시간낭비) 문제 해결을 위해 방안을 몰색하고 방안을 구현하기 위해 필요한 부분들을 학습하여 내가 맞닥뜨린 문제와 일관성이 있는지 판단..
JPA를 사용하는 궁극적인 목적은 데이터베이스 관점의 테이블과 객체지향적 객체 사이에서 개발자가 해야할 일을 최소화하고 객체지향적으로 자유롭게 개발하기 위해서다. 따라서, JPA를 사용하려면 가장 먼저 객체를 매핑해야한다. - 객체 매핑 CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, NAME VARCHAR(255), AGE INTEGER, PRIMARY KEY (ID) ) 위 테이블은 아래와 같이 객체 매핑을 할 수 있다. @getter @setter @Entity @Table(name="MEMBER") public class Member { @id private String id; @Column(nullable = true, length = 255, unique ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bz4rGB/btqJrxUVD47/K2npuJIqCY9A2kNNlJXBs1/img.png)
JPA(Java Persistence API)를 알기 위해서는 ORM(Object-Relational Mapping)을 알아야 한다. ORM은 객체와 관계형 데이터베이스를 맵핑해주는 녀석이다. 이전에 언급했듯이 자바의 객체와 관계형 데이터베이스간의 차이가 문제를 일으킬수 있다. 이 문제를 최소화 시키기 위해서 ORM이라고 하는 기술이 등장했다. JPA가 바로 자바 플랫폼의 ORM 표준 기술이다. JPA는 [그림 1]과 같이 동작하게 되는데, JPA가 자바 애플리케이션과 JDBC 사이에서 하는 일은 다음과 같다. 패러다임 불일치 해결 (DB 연동 시 유의할점 #2 참고) SQL query 생성 Entity 분석 (추 후에 이야기 하겠지만 여기서의 엔티티란 테이블을 객체화 시킨 것을 이야기 한다.) 우리는 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dxe6Ie/btqI6FZwGbU/JyBkZojDEaAbMOyxSx1dp1/img.png)
애플리케이션을 개발할 때 상용계 운영과 유지보수도 함게 생각하면서 개발해야 한다. 결국, 내부 로직이 복잡하면 복잡할 수록 유지보수가 어렵고 운영에도 영향을 미치기 쉬울 수 있다. 데이터베이스를 연동 할 때도 복잡해서는 안된다는 이야기이다. 이전 글에서 언급한 것 처럼 개발을 하게 된다면, 유지보수가 말도 못하게 힘들 수 있다. 그렇다고 데이터베이스 연동을 안할 수 없지 않는가. 데이터베이스는 객체지향 이야기 되는 추상화, 상속, 다형성의 개념이 없고, 구조 조차도 다르다. 즉, 객체와 RDB는 각각 지향하는 목적이 다르기 때문에 사용 방법과 표현방식에 차이가 있을 수 밖에 없다. 이 것을 패러다임 불일치 문제라고 이야기 한다. 이러한 문제때문에 객체 구조를 DB 테이블 구조에 저장하는데에 한계가 있을 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bj3ZMu/btqI5Ac9qGI/j6WYkM92qXrP4LWVT3Ccj1/img.png)
현대시대에는 자바로 개발되는 애플리케이션을 보면 대부분 관계형 데이터베이스를 사용하고 있다. 이 데이터베이스에서 데이터를 관리하려면 SQL을 사용해야한다. 자바 애플리케이션은 JDBC를 사용해서 DB에 접근한다. 다음 코드를 보자. 우리는 JDBC에게 SQL문을 전달하여 실행하도록 하면서 데이터를 관리한다. String sql = "SELECT NAME FROM MEMBER WHEHERE ID = ?"; ResultSet resultSet = stmt.executeQuery(sql); String name = resultSet.getString("NAME"); Member member = new Member(); member.setName(name); logger.info(member.getName())..