본문 바로가기

전체 글102

협력,, 객체지향 시스템은 자율적인 객체들의 공동체이다. 객체는 고립된 존재가 아니라 시스템의 기능이라는 더 큰 목표를 달성하기 위해서 다른 객체와 협력하는 사회적인 존재이다. 협력은 객체지향 세계에서 기능을 구현할수 있는 유일한 방법이다. 두 객체 사이의 협력은 하나의 객체가 다른 객체에게 도움을 요청할 때 시작된다. 메세지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다. 메시지를 수신한 객체는 메서드를 실행해서 요청에 응답한다. 여기서 객체가 스스로 메서지를 처리할 방법을 선택한다. 외부 객체는 메세지를 전송할 뿐이며, 메세지를 어떻게 처리할 지는 메세지를 수신한 객체가 직접 결정한다. Screening 이 Movie 에게 처리를 위임하는 이유는 계산하는데 필요한 기본 요금과 할.. 2022. 3. 28.
JPA) Join Fetch, @EntityGraph 차이점 기본적으로 JPA를 사용하다보면 발생하는 대표적인 성능문제가 있다. 바로 N+1 문제이다. N+1 문제에 대한 해결책은 대체로 알려진 방식이 많이 있다. 간단하게 나열하면 다음과 같다. 1. Join Fetch 의 사용 2. @EntityGraph 이외에도 Batch Size 설정 & Hibernate Fetch Mode 설정 등이 있다. 사실 Join Fetch, @EntityGraph 라는 대답은 모두가 알고 있다. 대부분 JPA를 공부하는 개발자라면 알고있다. 두 설정의 공통점은 N+1을 해결한다는 점이지만, 해결하는 과정에서 조금의 차이가 존재한다. 그것은 사용하는 SQL이 다르다는 점이다. 연관관계의 fetch 속성은 LAZY 로 설정했다 1. @EntityGraph 를 사용 한 경우 @Enti.. 2022. 3. 24.
의도를 분명히 밝혀라 의도를 분명히 밝혀라 ‘의도가 분명하게 이름을 지으라’고 말하기는 쉽다. 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다. 그러므로 이름을 주의깊게 살펴 더 나은 이름이 떠오르면 개선하자. 변수 나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다. 변수의 존재이유? , 수행 기능은? , 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다. int d; //경과 시간(단위: 날짜) 이름 d 는 아무 의미도 드러나지 않는다. 경과 시간 이나 날짜 라는 느낌이 안든다. 측정하려는 값과 단위를 표현하는 이름이 필요하다. int elapsedTimeInDays; int daysSinceCreation; int daysSinceMod.. 2022. 3. 23.
JPA) Spring OSIV 스프링 OSIV 스프링 에서 제공하는 OSIV 는 ‘비즈니스 계층에서 트랜잭션을 사용하는 OSIV’ 이다. 말 그대로 비즈니스 계층에서만 트랜잭션을 사용하는 것이다. 동작원리는 다음과 같다. 요청이 들어오면 서블릿필터 나 스프링 인터셉터 에서 영속성 컨텍스트를 생성한다. Service 계층에서 트랜잭션을 시작할 때 생성되어 있던 영속성 컨텍스트를 찾아서 트랜잭션을 실행한다. Service 계층 이 끝나면 트랜잭션을 커밋하고 Flush 한다. 이때 트랜잭션만 종료된다. Controller , View 까지 영속성 컨텍스트가 유지되므로 조회된 엔티티는 영속상태를 유지한다. 필터 나 인터셉터 로 요청이 돌아오면 영속성 컨텍스트를 종료한다, 이때 Flush 는 일어나지 않는다. 트랜잭션 없이 읽기 영속성 컨텍스.. 2022. 3. 14.
JPA) 과거 방식의 OSIV OSIV란? 영속성 컨텍스트를 View 계층까지 열어 둔다는 뜻이다. 영속성 컨텍스트가 살아 있다는 것은 엔티티가 영속상태로 유지된다는 것이며, 따라서, View 계층에서도 지연 로딩을 쓸수 있다는 것이다. 과거의 OSIV : 요청 당 트랜잭션 핵심은 View 계층에서 지연 로딩이 가능하다는 점이다. 과거의 OSIV는 클라이언트 요청이 들어오면 서블릿 필터 또는 스프링 인터셉터에서 트랜잭션을 시작하고 요청이 끝날 때 트랜잭션을 종료하는 것이다. 영속성 컨텍스트와 트랜잭션의 범위가 같기 때문에 조회한 엔티티도 View에서 영속상태를 유지하고 지연 로딩 또한 가능하므로 Entity를 미리 초기화할 필요가 없다. 문제점. * Presentation 계층에서 Entity의 변경이 이루어질 수 있다. 특정 화면에.. 2022. 3. 13.
JPA) 값 타입 컬렉션 vs @OneToMany 엔티티 는 식별자가 있어서 엔티티의 값을 변경해도 식별자로 DB에 저장된 원본 데이터를 쉽게 찾아서 변경 할 수 있다. 반면 값 타입은 식별자라는 개념이 없고 단순한 값들의 모음이므로 값을 변경해버리면 DB에 저장된 원본 데이터를 찾기어렵다. JPA 구현체들은 값 타입 컬렉션에 변경사항이 생기면 값 타입 컬렉션과 관련된 데이터를 모두 삭제하고, 다시 현재 값 타입 컬렉션에 있는 데이터를 저장한다. 실무에서는 값 타입 컬렉션에 매핑된 데이터가 많으면 값 타입 컬렉션 대신 일대다 관계를 고려해야 한다. 추가로 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키로 구성해야 한다. 따라서 DB 기본 키 제약조건으로 인해 컬럼에 null 을 입력할 수 없고 같은 값을 중복해서 넣을 수 없는 제약도 있다.. 2022. 3. 12.