본문 바로가기

전체 글

(51)
값 타입 #9 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 특징 생명주기를 엔티티의 의존 예) 회원을 삭제하면 이름, 나이 필드도 함께 삭제 값 타입은 공유하면 안 된다 예) ..
프록시와 연관관계 관리(지연로딩, 즉시로딩) #8 프록시 Member를 조회할 때 Team도 함께 조회해야 할까? 회원과 팀 함께 출력 public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName()); } 회원만 출력 public void printUser(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTe..
고급매핑 #7 상속 매핑 관계형 데이터베이스는 상속관계 x 객체의 상속 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑 구현 방법 조인 전략 : 각각 테이블로 변환 단일 테이블 전략 : 통합 테이블로 변환 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) 조인 전략 : JOINED 단일테이블 : SINGLE_TABLE 구현클래스마다 테이블 전략 : TABLE_PER_CLASS @DiscriminatorColumn(name="DTYPE") => 자식클래스를 구분하는 컬럼 지정하지 않으면 DTYPE으로 자동생성됌. @DiscriminatorValue("XXX") => DTYPE에 들어갈 값, 지정하지 않으면 자식클래스의 클래스..
[디자인 패턴] 심플 팩토리, 팩토리 메소드, 추상 팩토리 정의 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 즉 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것. 결론 객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮추어 코드를 건드리는 횟수를 최소화 하기 위한 패턴이다. 결합도는 왜 낮아지는가? 그것은 객체지향 성질중에 하나인 다형성을 이용 하였기 때문이다. 인터페이스를 구현한 객체들은 같은 인터페이스를 바라 보기 때문에 코드에 유연함이 있기 때문이다. 왜 코드를 건드리는 횟수가 최소화 될까? 객체를 생성하는 코드 부분을 분리 시켰기 때문에 객체를 추가/수정이 일어 나더라도 객체를 생성하는 코드만 건들면 되기 때문이다. 일단, 객체를..
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) 정의 특정 클래스의 인스턴스가 하나만 만들어지고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴 singleton private 멤버변수 선언 생성자를 private로 선언하여 외부에 노출이 되지 않도록 함 이후에 Static으로 전역에서 접근이 가능한 메소드(getInstance)를 생성해서 인스턴스를 반환 => 멤버변수에 이미 변수가 생성이 되어 있다면 해당 인스턴스를 리턴하며, 만약 인스턴스가 한번도 초기화 되지 않았다면, 생성한 후 리턴 예시) 프린터를 사용하는 사람이 여러명이라고 치자. 프린터를 사용하는 사람이 많다고 해서 프린터를 여러대를 구매하여 사용하는것은 매우 불필요한 낭비를 발생. => 해결책 프린터를 하나만 구매하여 공유하는 방법 프린터 관리자 public class Prin..
[디자인 패턴] 옵져버 패턴(Observer Pattern) 정의 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 정보가 자동으로 갱신되는 방식으로, 일대다(one-to-many) 의존성을 정의한다. 옵저버 패턴에서 주제자는 옵저버에 대한 정보가 없습니다. 오직 옵저버가 특정 인터페이스(Interface)를 구현한다는 것 만 알고 있습니다. 즉, 옵저버가 무슨 동작을 하는지 모른다는 것입니다. 게다가 옵저버는 언제든지 새로 추가되거나 제거될 수 있으며 새로운 형식의 옵저버를 추가할 때에도 주제에 전혀 영향을 주지 않습니다. 이러한 관계를 느슨한 결합(Loose coupling)이라고 합니다. 어떻게 이런 특징이 있을까요? 위의 UML을 확인해 보겠습니다. Subject interface는 등록, 해제, 갱신을 위한 API를 제공합니다. 그리고 이를 상..
[디자인패턴] 어댑터 패턴(Adaptor Parttern) 정의 어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다. 우리나라와 다른 콘센트나 전압(220V)을 쓰는 외국에 가면 그 나라의 콘센트와 전압(110V)을 사용할 수 있게 해주는 어댑터를 볼 수 있다. 어댑터란 형식이 다른 둘 사이에 연결되서 이 둘이 호환될 수 있도록 해주는 도구이다. 객체지향에서 어댑터는 보통 인터페이스가 다른 서로 다른 객체들이 같은 형식 아래 자동할 수 있도록 하는 역할을 한다. 예시) 양식 자격증을 가진 요리사는 '요리'를 하고 파티셰 자격증을 가진 파티셰는 '제과'를 한다 많은 요리사들이 일하는 식당에서 디저트 메뉴를 제공하기 위해 파티셰를 고용했다...
[디자인패턴] 데코레이터 패턴(Decorator Pattern) 정의 객체에 동적으로 새로운 책임을 추가할 수 있게 합니다. 기능을 추가하려면, 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다. 특정 클래스의 객체들이 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는대로 골라 시키거나 기능들을 필요에 따라 장착할 수 있도록 할 때 사용된다. 예시) 비행기 게임에서 전투기가 아이템을 먹을 때마다 기본공격 + 새로운 공격 => 아이템을 먹을때마다 공격이 더 화려해짐. 커피는 기본 에스프레소에서 재료를 더할 때마다 새로운 종류의 커피가 된다. 에스프레소 + 물 => 아메리카노 에스프레소 + 물 + 얼음 => 아이스 아메리카노 에스프레소 + 우유 => 라떼 에스프레소 + 우유 + 얼음 => 아이스 라떼 대충 이런식ㅎㅎ; 코드로 확인해보자! Componen..