JSP 13. 빌더 패턴(Builder Pattern)

zhyun1220·2020년 12월 4일
0

JspSpring

목록 보기
18/39

복습

  • 세션이 유지되는 구조(session tracking) : 세션 유지를 위한 session id 재전송 방법
    • WAS에 의해 어떻게 이용될 수 있는지
    • 쿠키저장소는 브라우저마다 각각 갖고있다.
    • Http Stateless특성을 보안하기 위해 (상태유지를 위해)
    • 클라이언트에 있는 저장소 -- 쿠키 활용
      • ex) 멜론 비회원 재생목록 다시 들어가도 안지워져있음
      • 단점 : 한사이트에서 저장할 수 있는 쿠키의 개수는 제한되어있음, 보안에 취약
    • 쿠키라는 트래킹 모드
  • 제일 안전하고 확실한 삭제는 invalidate
  • timeout
    • 한세션안에서 마지막 요청이 발생된 시간에서 새로운 요청이 발생된 중간 시간

2020.12.07 금요일

webStudy01 프로젝트를 복사해서 homework프로젝트로 변경


  • webStudy01 -> homework로 변경

자바빈(ValueObject, DataTransferObject, Model)

  • javaBean 규약에 따라 정의된 재사용 가능한 객체
  1. 상태 유지를 위한 property
  2. 캡슐화
  3. 캡슐화된 property에 접근하기 위한 인터페이스 제공
  4. 상태비교 방법 제공
  5. 상태확인 방법 제공
  6. 상태기록 방법 제공

빌더 패턴(Builder Pattern)

  • 객체의 생성 방법과 표현 방법을 분리한다

점층적 생성자 패턴

  1. 필수 인자를 받는 필수 생성자를 하나 만든다.
  2. 1개의 선택적 인자를 받는 생성자를 추가한다.
  3. 2개의 선택적 인자를 받는 생성자를 추가한다.
  4. ...반복
  5. 모든 선택적 인자를 받는 생성자를 추가한다.

점층적 생성자 패턴 코드의 예 : 회원가입 관련 코드

public class Member {

    private final String name;      // 필수 인자
    private final String location;  // 선택적 인자
    private final String hobby;     // 선택적 인자

    // 필수 생성자
    public Member(String name) {
        this(name, "출신지역 비공개", "취미 비공개");
    }

    // 1 개의 선택적 인자를 받는 생성자
    public Member(String name, String location) {
        this(name, location, "취미 비공개");
    }

    // 모든 선택적 인자를 다 받는 생성자
    public Member(String name, String location, String hobby) {
        this.name = name;
        this.location = location;
        this.hobby = hobby;
    }
}

장점
new Member("홍길동", "출신지역 비공개", "취미 비공개") 같은 호출이 빈번하게 일어난다면, new Member("홍길동")로 대체 가능

단점

  • 다른 생성자를 호출하는 생성자가 많아지므로, 인자가 추가되는 일이 발생하면 코드를 수정하기 어렵다.
  • 코드 가독성이 떨어진다.
    • 특히 인자수가 많을때 호출 코드만 봐서는 의미를 알기 어렵다.

호출코드만으로는 각 인자의 의미를 알기 어렵다

NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 3, 35, 27);
NutritionFacts pepsiCola = new NutritionFacts(220, 10, 110, 4, 30);
NutritionFacts mountainDew = new NutritionFacts(230, 10);

빌더패턴(Effect Java스타일)

장점

  • 각인자가 어떤 의미인지 알기 쉽다
  • setter메소드가 없으므로 변경 불가능(immutable) 객체를 만들 수 있다.
  • 한번에 객체를 생성하므로 객체 일관성이 깨지지 않는다.
  • build() 함수가 잘못된 값이 입력되었는지 검증하게 할 수도 있다.

예시 /webStudy02_Maven/src/main/java/kr/or/ddit/vo/BtsVO.java

public class BtsVO implements Serializable{ 
	//1. privat 생성자 필요 -- 모든 선택적 인자를 다 받은 생성자
	private BtsVO(String code, String name, String url) {
		super();
		this.code = code;
		this.name = name;
		this.url = url;
	}

	private String code;
	private String name;
	private String url;

	public String getCode() {
		return code;
	}

	public String getName() {
		return name;
	}

	public String getUrl() {
		return url;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((code == null) ? 0 : code.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		//상태비교 방법 제공★★
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BtsVO other = (BtsVO) obj;
		if (code == null) {
			if (other.code != null)
				return false;
		} else if (!code.equals(other.code))
			return false;
		return true;
	}

	@Override
	public String toString() {
		//url은 외부에 노출되면 안되니까 뺐음 -- 상태확인 방법 제공
		return "BtsVO [code=" + code + ", name=" + name + "]";
	}
	
	
	public static BtsVOBuilder getBuilder() {
		return new BtsVOBuilder(); //객체 생성
	}
	//2. builder 이너클래스, 외부에서 쓸 녀석
	public static class BtsVOBuilder{ 
		//빌드할 객체가 build()에도 똑같이 있어야 한다.
		private String code;
		private String name;
		private String url;
		
		//4. 마치 setter와 같은 역할을 하고 있는 현재 가지고 있는 상태와 이름이 동일한 메서드, 리턴타입이 존재
		//이렇게 하면 .으로 체인을 이어갈 수 있다.
		public BtsVOBuilder code(String code) {//setter의 역할 (기본 setter와의 차이)
			this.code = code;
			return this;
		}
		public BtsVOBuilder name(String name) {//setter의 역할 (기본 setter와의 차이)
			this.name = name;
			return this;
		}		
		public BtsVOBuilder url(String url) {//setter의 역할 (기본 setter와의 차이)
			this.url = url;
			return this;
		}
		//3. 이게 꼭 있어야한다.
		public BtsVO build() {
			return new BtsVO(code, name, url);
		}
	}
}
  • BtsVO클래스에 implements Serializable
    • 직렬화,역직렬화 가능한 객체 -- 상태 기록 방법
    • 파일기록 -- 파일빼낸다..출력
  • private 생성자 필요
    • 외부에서 맘대로 사용하지 못하게 (호출하지 못하게)
  • hashcode() & equals()
    • 상태비교 방법 제공
  • toString
    • 상태확인 방법 제공
    • 노출되면 안되는 부분은 빼도 댐!
  • Builder 이너클래스 필요
    • 외부에서 쓸 녀석 public static
    • 아래 메서드 build()
      빌드할 객체가 똑같이 있어야 한다.
public BtsVO build() {
	return new BtsVO(code, name, url);
}
  • 이 부분이 꼭 있어야 한다⭐ build()
public BtsVOBuilder code(String code) {
	this.code = code;
	return this;
}
  • 이부분이 setter역할
    • 자바빈 패턴의 setter와 차이점
      : return this; 리턴타입이 존재
    • .으로 체인을 이어갈 수 있다.

자바빈 패턴(JavaBeans pattern)

  • setter메서드를 이용해 생성코드를 읽기 좋게 만드는 것
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohdydrate(27);

장점

  • 각 인자의 의미를 파악하기 쉬어졌다.
  • 복잡하게 여러개의 생성자를 만들지 않아도 된다.
    단점
  • 객체 일관성(consistency)이 깨진다.
    • 1회의 호출로 객체 생성이 끝나지 않았다.
    • 즉 한 번에 생성하지 않고 생성한 객체에 계속 set하고 있다.
  • setter메서드가 있으므로 변경 불가능 (immutable)클래스를 만들 수가 없다.
profile
HI :)

0개의 댓글