https://www.youtube.com/watch?v=IJ3W6xEx8Oo
네트워크를 통해 데이터베이스에 접근하는 시간 비용은 애플리케이션 서버에서 내부 메모리에 접근하는 시간 비용보다 수만에서 수십만 배 이상 비싸다. 따라서 조회환 데이터를 메모리에 캐시해서 데이터베이스 접근 횟수를 줄이면 애플이케이션 성능을 획기적으로 개선할 수 있다. 영속성 컨텍스트 내부에는 엔티티를 보관하는 저장소가 있는데 이것을 1차 캐시라한다. 일잔적인 웹 애플리케이션 환경은 트랜젝션을 시작하고 종료할 때까지만 1차 캐시가 유효하다. 하이버네이트를 포함한 대부분의 JPA 구현체들은 애플리케이션 범위의 캐시를 지원하는데 이것을 공유 캐시 또는 2차 캐시라 한다. 이런 2차 캐시를 활용하면애플리케이션 조회 성능을 향상 할 수 있다. ( JPA 책에서 현재 1차 2차 캐시 정보에 대한 부분이 나오는데, 사..
Transaction 범위 영속성 컨텍스트, 준영속 상태 스프링 컨테이너는 트랜젝션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 한마디로 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다. 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다. 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다. 스프링이나 J2EE 컨테이너의 가장 큰 장점은 트랜잭션과 복잡한 멀티 스레드 상황을 컨테이너가 처리해준다는 점이다. 따라서 개발자는 싱글 스레드 애플리케이션처럼 단순하게 ..
JPA가 제공하는 낙관적 락을 사용하려면 @Version 애노테이션을 사용해서 버전 관리 기능을 추가해야 한다. @Version 적용 가능 타입은 다음과 같다. Long, Integer. Short, Timestamp @Entity public class MyEntity implements Serializable { @Id @GeneratedValue private Long id; private String name; @Version private Long version; //... } Board board = em.find(Board.class, id); // transaction version = 1 // transaction 2에서 해당 게시물을 수정해서 title = "제목C", version =..
동시성 프로그래밍에서 고려되야 할 사항으로 트랜젝션 처리가 있는데, 트랜젝션 처리를 어떤 방향으로 하느냐에 따라서 성능이 좌우된다. 낙관적 락은 트랜젝션 대부분 충돌이 발생하지 않는다고 가정하는 방법이다. 쉽게 말해 애플리케이션이 제공하는 락이다. 낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌을 알 수 없다는 특징이 있다. 비관적 락은 트랜잭션의 충돌이 발생한다고 가정하고 우선 락을 걸고 보는 방법이다. 데이터 베이스가 제공하는 락 기능을 사용한다. 대표적으로 select for update 구문이 있다. 추가로 데이터베이스 트랜잭션 범위를 넘어서는 문제도 있다. 예를들어 사용자 A와 B가 동시에 제목이 같은 공지사항을 수정한다고 생각해보자. 둘이 동시에 수정화면을 열어서 내용을 수정하는 중에..
준영속 상태의 가장 골치 아픈 문제는 지연로딩 기능이 동작하지 않는다는 점이다. 예를 들어 뷰 랜더링할 때 연관된 엔티티도 함께 사용해야 하는데 연관된 엔티티를 지연 로딩으로 설정해서 프록시 객체로 조회했다고 가정하자. 아직 초기화 하지 않은 프록시 객체를 사용하면 실제 데이터를 불러오려고 초기화를 시도한다. 하지만 준영속 상태는 영속성 컨텍스트가 없으므로 지연 로딩을 할 수 없다. 이때 지연 로딩을 시도하면 문제가 발생한다. 만약 하이버 네이트를 구현체로 사용하면 org.hibernate.LazyInitializationException예외가 발생한다. 준 영속 상태의 지연 로딩 문제를 해결하는 방법은 2가지가 있다. - 뷰가 필요한 엔티티를 미리 로딩해두는 방법 - OSIV를 사용해서 엔티티를 항상 ..
엔티티 타입의 특징 - 식별자(@id)가 있다. - 엔티티 타입은 식별자가 있고 식별자로 구별할 수 있다. - 생명 주기가 있다. - 생성하고, 영속화하고, 소멸하는 생명 주기가 있다. - em.persist(entity)로 영속화 한다. - em.remove(entity)로 제거한다. - 공유 할 수 있다. - 참조값을 공유할 수 있다. 이것을 공유 참조라 한다. - 예를 들어 회원 엔티티가 있다면 다른 엔티티에서 얼마든지 회원 엔티티를 참조할 수 있다. 값 타입 특징 - 식별자가 없다. - 생명 주기를 엔티티에 의존한다. - 스스로 생명주기를 가지지 않고 엔티티에 의존한다. 의존하는 엔티티를 제거하면 같이 제거된다. - 공유하지 않는 것이 안전하다. - 엔티티 타입과는 다르게 공유하지 않는 것이 안전..
User.java @Entity @Data public class User implements Serializable { private static final long serialVersionUID = 5641286815646499270L; @Id @Size(max = 50) private String email;// 회원아이디 @Size(max = 50) private String name;// 이름 @Enumerated(EnumType.STRING) private UseStatus useStatus;// 사용여부 @OneToMany private List sites;// 검수 사이트 목록 private String photo;// 프로필 사진 private String facebookId;// 페이스..
- Total
- Today
- Yesterday
- jstl split
- POI EXCEL
- java 설정
- 전자정부프레임워크 tiles
- java 설치
- JSTL
- spring ExcelView
- java calendar
- JSP 세션
- java 압축 풀기
- MyBatis 팁
- java 폴더구조 구하기
- java 특정문자 갯수구하기
- jstl foreach
- spring property
- mybatis Merge
- github image 첨부시 주의할점
- jstl 커스텀 태그
- 코루틴
- Database#transaction
- POE Excel 만들기
- coroutine
- Kotlin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |