본문 바로가기

전체 글

(51)
창발적 설계로 깔끔한 코드 구현하기 #11 1. 창발성 2. 창발적 설계 2. 모든 테스트를 실행한다. 3. 중복을 없앤다. 4. 의도를 표현한다. 5. 실용적 관점에서 타협한다. 창발성 하위 계층에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출연하는 현상. 각각의 개미는 집을 지을 능력이 없지만, 작은 개미들의 상호작용을 통해 집이라는 결과물이 나오는 것처럼, 작은 요소들의 상호작용의 반복이 전체 구조에 영향을 미친다. 창발적 설계 단순한 4가지를 반복하다 보면 전체적으로 깨끗한 코드가 만들어진다. 1. 모든 테스트를 실행한다. 2. 중복을 없앤다. 3. 프로그래머 의도를 표현한다. 4. 클래스와 메서드 수를 최소로 줄인다. 실용적 관점에서 타협한다. - 켄드 백 모든 테스트를 실행한다. 모든 테스트 케이스를 항상 통과..
관심사 분리 패턴 #10 관심사 분리 소프트웨어는 (애플리케이션 객체를 제작하고 의존성을 서로 '연결'하는) 준비과정과 (준비 과정에 이어지는) 런타임 로직을 분리해야 한다. 객체의 생성과 객체를 사용하는 부분을 분리한다. 시작에 대한 관심사 분리 시작 단계는 모든 애플리케이션이 풀어야 할 관심사다. main 함수에서 시스템에 필요한 객체를 생성한 후 애플리케이션에 넘긴다. 애플리케이션은 그저 만들어진 객체를 사용한다. 모든 객체가 생성되었다고 가정하고, 객체를 이용한 개발에 집중할 수 있다. 요청에 대한 관심사 분리 Spring 프레임워크를 통해 요청에 대한 관심사를 분리해 요청 처리에 대한 비즈니스 로직에 집중할 수 있다. Servlet Filter 서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 요청 내..
벌크 연산 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면? JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행 재고가 10개 미만인 상품을 리스트로 조회한다. 상품 엔티티의 가격을 10% 증가한다. 트랜잭션 커밋 시점에 변경 감지가 동작한다. 변경된 데이터가 100건이라면 100번의 update SQL 실행 벌크 연산 주의 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리 만약 어떤 그룹의 연봉을 4000만원에서 5000만 원으로 수정하는 벌크 연산을 날리게 되면 데이터베이스에 직접 쿼리 하여 값이 수정된다. 하지만 영속성 컨텍스트를 무시했기 때문에 영속성 컨텍스트에는 아직 4000만 원으로 설정되어 있음. Member member1 = new Member(); member1.s..
JPQL 중급 문법 - 페치조인2 페치 조인의 특징과 한계 페치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 가급적 사용 X // 페치 조인 대상에는 별칭을 줄 수 없다. select t from Team t join fetch t.members m // 이렇게 풀면 안됌.. select t from Team t join fetch t.members m where m.age > 10 둘 이상의 컬렉션은 페치 조인할 수 없다. 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다. 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험) 정리 모든 것을 페치 조인으로 해결할 수는 없음 페치 조인은 객체 그래프를 유지할 때 사용하면 효과적 여러 테이..
JPQL 중급 문법 - 페치 조인1 페치 조인(fetch join) SQL 조인 종류 X JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 // 페치 조인 select m from Member m join fetch m.team // 실제 실행되는 쿼리 select m.*, t.* from member m inner join team t on m.team_id = t.id String query = "select m from Member m"; List result = em.createQuery(query, Member.class) .getResultList(); for(Member member: result) { System.out.println("..
JPQL 중급 문법 - 경로표현식 경로 표현식 . (점)을 찍어 객체 그래프를 탐색하는 것. select m.username -> 상태 필드 from Member m join m.team t-> 단일 값 연관 필드 join m.orders o-> 컬렉션 값 연관 필드 where t.name = '팀A' 상태 필드 : 단순히 값을 저장힉 위한 필드 연관 필드 : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne 대상이 엔티티 컬력션 값 연관 필드 : @OneToMany, @ManyToMany 대상이 컬렉션 경로표현식 특징 상태필드 : 경로 탐색의 끝, 탐색 x 단일 값 연관 경로 : 묵시적 내부 조인(inner join) 발생, 탐색 o 컬렉션 값 연관 경로 : 묵시적 내부 조인 발생, 탐색 x from ..
JPQL 기본 문법 JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL은 엔티티 객체를 대상으로 쿼리 SQL은 데이터베이스 테이블을 대상으로 쿼리 문법 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자 구분 O (Member, age) JPQL 키워드는 대소문자 구분X ..
클래스를 잘 설계하기 #9 목차 캡슐화되어야 한다. 단일 책임 원칙 낮은 결합도, 높은 응집도 변경하기 쉬워야 한다. 캡슐화되어야 한다. 객체의 실제 구현을 오부로부터 감추는 방식 클래스를 개발할 때 기본적으로 구현을 감추고, 외부 객체와 상호작용하는 부분만 노출한다. 외부의 잘못된 사용을 방지한다. 경계에서 배웠던 부분! Map Stack 예제 필드를 private로 제한, get 으로 읽기 수정은 push, pop 메서드를 통해서 일어나도록 제한 class Stack { class Node { private T data; private Node prev; Node(T data) { this.data = data; } } private Node top; public void push(T data) { Node node = new..