반응형

분류 전체보기 277

[리팩토링] 중재자(Middle Man)

중재자(Middle Man) 란? 캡슐화를 통해 내부의 구체적인 정보를 최대한 감출 수 있다. 그러나, 어떤 클래스의 메소드가 대부분 다른 클래스로 메소드 호출을 위임하고 있다면 중재자를 제거하고 클라이언트가 해당 클래스를 직접 사용하도록 코드를 개선할 수 있다 메세지 체인의 반대라고 생각하면 좋다 메세지 체인은 캡슐를 하여 코드를 최대한 줄이면서 이어 나가지만 모든 코드가 캡슐화로 되어있으면 필요없는 코드까지 캡슐화가 되기 때문에 이러한 문제를 해결하는 방법 중 하나가 중재자 냄새이다. 관련 리팩토링 중재자 제거하기(Remove Middle Man) 함수 인라인(Inlince Function) 슈퍼 클래스를 위임으로 바꾸기 서브클래스를 위임으로 바꾸기 중재자 제거하기 같은 경우는 클라이언트가 필요한 클..

카테고리 없음 2022.10.12

엔티티의 생명주기

엔티티는 4단계의 생명 주기 비영속 (new/transient) 영속 (managed) 준영속 (datached) 삭제 (removed) 영속성 관리 비영속 (new/transient) 비영속 상태는 객체를 새로 생성한 상태이다. JPA와 전혀 관계없이 객체만 생성한 상태이다. Member member = new Member(1L,"test"); //member는 비영속 상태 영속 상태가 아니므로 당연히 영속성 컨텍스트에 의해 관리되지 않으며, 1차 캐시, 변경감지등의 기능이 적용되지 않는다. 영속 (managed) 영속성 컨텍스트에 의해서 관리되어지는 상태이다. 생성한 객체를 em.persist()를 통해 영속성 컨텍스트에 저장하거나, 혹은 em.find()를 통해 DB에서 엔티티를 조회하면 영속성 컨..

Language/Java 2022.10.10

옵저버 패턴(Observer Pattern)

옵저버 패턴이란? 객체의 상태 변화를 관찰하는 관찰자들 즉, 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 어떤 객체의 변경 사항이 발생하였을때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 된다. 다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴 발행(publish) - 구독 (subscribe) 패턴을 구현할 수 있다 옵저버 패턴 사용 예제 공지사항을 알리때를 예제로 공지사항을 전파할때(상태변환) 옵저버와 관련된 객체들(유저들)에게 통지하도록 하는 간단한 예제를 옵저버 패턴으로 만들어보도록 하겠다. Observer.class public class Observer { public..

디자인패턴 2022.10.08

메멘토 패턴(Memento Pattern)

메멘토 패턴이란? 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴을 말한다. 구조 Originator : 우리가 저장할 객체이다. 즉 originator의 state를 저장할 것이다 Care Taker : originator의 내부 정보를 Care Taker가 가져와서 저장한다 Memento : 내부정보를 추상화한 클래스. Care Taker는 Originator의 디테일한 정보를 직접적으로 가지는 것이 아니라 memento타입으로 가진다. 예제 코드 만약 게임을 하는데. 게임을 중지시켰다가 다시 실행해도 중지 전까지 스코어는 유지되어야 한다. @Getter @Setter public class Game { private int redTeamScore; ..

디자인패턴 2022.10.08

커맨드 패턴 (Command Pattern)

커맨드 패턴 이란? Client가 보낸 요청을 객체로 캡슐화하여 이를 나중에 이용할 수 있도록 필요한 정보를 저장, 로깅, 취소할 수 있게 하는 패턴 요청을 캡슐화 하여 호출자(invoker)와 수신자(reveiver)를 분리하는 패턴이다. - 요청을 처리하는 방법이 바뀌더라도, 호출자의 코드는 변경되지 않는다 구성요소 1. 수신자(Receiver) : 행동을 담당하는 객체 -> 기능을 수행 2. 커맨드(Command) : 수신자의 정보 + 행동이 들어있는 객체 3. 호출자(invoker) : 커맨드를 저장하는 객체 -> 버튼이 어떤 수행을 할 것인지 결정 4. 클라이언트(Client) : 커맨드 객체를 생성하고, 호출자를 통해 수신자에게 할 행동을 결정 예제 코드 1.Button, MyApp 호출자 (..

디자인패턴 2022.10.08

책임 연쇄 패턴(Chain of Responsibility Pattern)

책임 연쇄 패턴이란? 요청을 보내는 쪽(sender)과 요청을 처리하는(receiver) 쪽을 분리하는 패턴이다. 핸들러 체인을 사용해서 요청을 처리한다. 클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 Chain으로 만들어 결합을 느슨하게 하기 위해 만들어진 패턴이다. 일반적으로 요청을 처리할 수 있는 객체를 찾을 때까지 집합 안에서 요청을 전달한다. 예제 코드 public abstract class Handler { public String name; private Handler next; public Handler(String name) { this.name = name; } public void setNext(Handler next) { this.next = next; } public voi..

디자인패턴 2022.10.08

[SQL] ERROR 1146 (42S02): Table doesn't exist 에러

원인 Entity에 작성한 테이블과 DB에 만든 테이블이 일치 하지 않아서 생기는 에러이다. 게시물과 회원의 연관관계 매핑을 할때도 Entity와 DB가 일치 하지 않으면 이러한 에러가 발생이 일어날수가 있다. 해결 방법 1. Entity와 DB의 이름이 같은지 한번더 확인한다. 2, application.properties , application.yml 에서 Table을 자동 생성 해주면 된다. spring.jpa.hibernate.ddl-auto=update ddl-auto 옵션 종류 create: 기존테이블 삭제 후 다시 생성 (DROP + CREATE) create-drop: create와 같으나 종료시점에 테이블 DROP update: 변경분만 반영(운영DB에서는 사용하면 안됨) validat..

DB/Mysql 2022.10.03

@Transactional

스프링에서 @Transactional 을 이용하여 트랜잭션 처리를 하는 방법 DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주면된다. 클래스, 메서드 모두에 @Transactional 어노테이션을 붙이면 메서드 레벨의 @Transactional 선언이 우선 적용된다. java //게시판의 게시글을 삭제하는 메서드 @Transactional public void removeBoard(Long id) throws Exception { replyDAO.removeAll(id); //삭제할 게시글의 답글 삭제 boardDAO.deleteBoard(id); //게시글 삭제 } @Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하..

Spring 2022.09.29

변경 감지와 병합(merge)

변경 감지와 병합(merge) JPA는 영속성 context에 테이블 형태의 1차 캐시를 두고 엔티티를 저장해서, Transaction commit 시, 1차 캐시의 영속된 값과 현재 entity값을 비교하여 변경이 된 것을 알아서 적용해준다. 준영속 상태 영속 상태였다가 더는 영속성 컨텍스트가 관리하지 않는 상태 영속성 컨텍스트로부터 분리된 상태 준영속 상태를 만드든 3가지 방법 1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 2. em.clear() : 영속성 컨텍스트를 완전히 초기화 3. em.close() : 영속성 컨텍스트를 종료 준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다 엔티티의 데이터를 가지고 있는 클라이언트 사이드로 넘기기 위한 객체 준영..

Spring 2022.09.29

템플릿 메소드 패턴(Template Method Pattern)

템플릿 메소드 패턴이란? 템플릿 메소드 패턴이란 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴이다. 디자인 패턴이라고 하기도 뭐할정도로 객체지향 언어로 개발을 하다보면 무의식적으로 사용하는 패턴이다. 주로 개발을 하다보면 구체적인 구현은 다르지만 기본적인 기능은 비슷한 경우가 종종 있다. 예를 들면 HTTP와 SMTP Client 프로그램의 경우, 주고받는 메시지의 내용이 서로 다를 뿐 둘 다 인터넷 프로토콜을 이용하여 서버에게 요청을 전달하고 결과를 수신한다는 점에서 동일하다. 이처럼 두개 이상의 프로그램이 기본적으로 동일한 골격 하에서 동작할때 기본 골격에 해당하는 알고리즘은 일괄적으로 관리하면서 각 프로그램마다 달라..

디자인패턴 2022.09.25
반응형