본문 바로가기

Study

(23)
[Pattern] Adapter Pattern Adapter Pattern 클래스를 바로 사용할 수 없는 경우가 종종 있다.(다른 곳에서 개발 or 수정할 수 없을 때) 그렇다면 중간에서 변환 역할을 해주는 클래스가 필요하다 -> 어댑터 패턴 상속을 통해 사용한다. 호환성이 없는 인터페이스를 사용하는 클라이언트 그대로 활용 가능하다. 향후 인터페이스가 바뀌더라도, 변경 내역은 어댑터에 캡슐화 되므로 클라이언트가 바뀔 필요가 없다. 즉 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환해준다.
[Pattern] 디자인 패턴 개요 디자인 패턴 개요 목적 SW의 재사용성, 호환성, 유지 보수성을 보장하기 위함. 특징 디자인 패턴은 특정한 구현이 아닌 아이디어이다. 무조건 적용해야 한다! 가 아니고 추후에 재사용, 호환, 유지 보수시 발생하는 문제를 예방하거나 해결하기 위해 패턴을 만들어 둔 것. 원칙 - SOLID(객체지향 설계 원칙) Robert C. Martin은 5가지 Software design principles을 정의하고 앞글자를 따서 SOLID라고 부른다. Single Responsiblilty Principle : 하나의 클래스는 하나의 역할만 해야한다. Open - Close Principle : 확장(상속)에는 열려있고, 수정에는 닫혀 있어야 한다. Liskov Substitution Principle : 자식이 ..
[JPA] Spring Data JPA와 QueryDSL 이해 Spring Data JPA와 QueryDSL 이해 Spring Data JPA 소개 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결 개발자는 인터페이스만 작성 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입 사용법 어지간한 쿼리는 JPARepository를 상속시키면 다 구현되어 있다. 특정 조건으로 조회쿼리를 짜야할 때 인터페이스만 만들어도 알아서 SPQL을 만들어 주기도 한다. 페이징 처리도 Pageable 인터페이스를 상속받은 객체를 파라미터로 넣어주면 알아서 페이징 처리를 해준다. Pagable page = new PageRequest(1,20,new Sort...); // 정렬도 가능 page result = memberRepository.findByName("hello",p..
[JPA] 객체 지향 쿼리 객체 지향 쿼리 JPA는 다양한 쿼리 방법을 지원 JPQL JPQ Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL(java persistence query language) 가장 단순한 조회 방법 em.find(); // 객체 그래프 탐색 a.getB().getC(); JPA를 사용하면 엔티티 객체를 중심으로 개발 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 SQL을 추상화해서 특정 데이터베이스 SQL에 의존 X JPQL을 한마디로 정의하자면 객체 지향 SQL JPQL 문법 select m from Member m where m.age > 18 from절에 있는 것은 객체 엔티티와 속성은 대소문자..
[JPA] JPA 내부 구조 JPA 내부 구조 영속성 컨텍스트 JPA를 이해하는데 가장 중요한 용어. 엔티티를 영구 저장하는 환경 이라는 뜻 영속성 컨텍스트는 논리적인 개념이기 때문에 눈에 보이지 않는다 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다. 엔티티의 생명 주기 비영속 (new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속 (managed) : 영속성 컨텍스트에 저장된 상태 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) : 삭제된 상태 비영속 생성만 되어있는 상태는 비영속 상태이다. 영속 객체를 생성한 후 엔티티매니저를 통해 DB에 넣은 상태 em.persist(manager) 영속성 컨텍스트의 이점 1차 캐시 동일성(identity) 보장 트랜..
[JPA] 양방향 매핑 양방향 매핑 객체에 양방향 연관관계를 적용시키려면 위와 같이 구성해야한다. 하지만 RDB에서는 처음부터 양방향으로 접근해 조회할 수 있다. 이를 구성하려면 Team객체를 아래와 같이 변경하면 된다. @Entity public class Team{ @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") // Collection 추가 List members = new ArrayList(); ... } // 조회 Team findTeam = em.find(Team.class, team.getId()); // 역방향 조회 int memberSize = findTeam.getMembers().size(); 연관관..
[JPA] 연관관계 매핑 연관관계 매핑 객체를 테이블에 맞추어 모델링 할 경우 외래 키 식별자를 직접 다룬다. DTO // Member @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @Column(name = "TEAM_ID") private Long teamId; // Team @Id @GeneratedValue private Long id; private String name; // 팀을 저장할 때 Team team = new Team(); team.setName("teamA"); em.persist(team); // 회원을 저장할 때 Member member = new Member(); m..
[JPA] JPA 필드와 컬럼 매핑 JPA 필드와 컬럼 매핑 데이터베이스 스키마 자동 생성하기 DDL을 애플리케이션 실행 시점에 자동 생성 테이블 중삼 -> 객체 중심 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 이렇게 생성된 DDL은 개발 장비에서만 사용 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용 hibernate.hbm2ddl.auto (어지간해서는 개발단계에서만 사용. 운영단계 사용 x) create : 기존테이블 삭제 후 다시 생성 create-drop : create와 같으나 종료시점에 테이블 DROP update : 변경분만 반영 (운영DB에는 사용하면 안된다.) validate : 엔티티와 테이블이 정상 매핑되었는지만 확인 none : auto 기능을 사용하지 않음. 위와 같..