본문 바로가기

전체 글154

[디자인패턴] 데코레이터 패턴 (Decorator Pattern) 목적 객체에 추가적인 책임을 동적으로 부여함 상속을 사용하지 않고 새로운 기능을 추가 데코레이터는 상속을 사용하지 않아도 유연하고 융통성 있는 기능 확장을 가능하게 함 서브클래스를 만들지 않고 기능을 유연하게 확장하는 방법 제공 요소 문제: 조금씩 다른 다양한 종류 -> 늘어날수록 확장 어려움 해결: 상속을 남용하지 않고 연관으로 필요한 기능 추가 결과: 확장성 정의 여기서 상속은 기능을 물려받기 위해서가 아니라 형식을 맞추기 위해서임 Component: 각 구성요소는 직접 쓰일 수도 있고 데코레이터로 감싸져서 쓰일 수도 있음, 추상클래스 또는 인터페이스로 구현 ConcreteComponent: 새로운 행동을 동적으로 추가 Decorator: 자신이 장식할 구성요소(Component)와 같은 인터페이스 .. 2021. 10. 14.
[디자인패턴] 옵저버 패턴 (Observer Pattern) 목적 객체간 1:N 의존 관계를 정의함 한 개 객체 상태가 변경될 때, 그 객체와 의존 관계에 있는 모든 객체들이 자동으로 알림을 받고 상태를 갱신 대표적으로 채팅방, 구독 서비스가 옵저버 패턴을 이용함 방주인, 발행자는 Subject (또는 Observerable, Publisher) - subject에게 정보를 push함 참여자, 구독자는 Observer (또는 Subscriber) 패턴 요소 문제: 1:N 관계에서 정보 갱신 - 구독자가 계속 loop를 돌며 업데이트가 있는지 확인할 수 없음 해결: 사용자를 등록하고, 정보가 변동하는 경우 알려주고 값을 자동으로 갱신 결과: loose coupling (구독자가 모든 정보를 아는게 아님), 확장성 (observer를 쉽게 추가/제거 가능) 구성 su.. 2021. 10. 13.
[디자인패턴] 스트래티지 패턴 (Strategy Pattern) 목적 같은 종류의 작업을 하는 알고리즘을 정의, 각 알고리즘을 캡슐화 알고리즘들을 서로 바꿔 사용할 수 있도록 함 스트래티지 패턴은 알고리즘을 사용하는 클라이언트로 부터 독립적으로 알고리즘을 바꿔서 적용시킬 수 있도록 함 요약 문제: 알고리즘의 다른 버전이 존재해서, 중복으로 존재하거나 if문을 이용해서 선택해야 함 -> OCP 위반 해결: 중복을 공통화시키고, 실행 시점에 맞는 알고리즘을 호출하도록 함 (상속 또는 인터페이스 활용) 결과: 수정할 경우 strategy를 추가하고, 나머지는 변경하지 않아도 됨. 구성 Context 클래스 캡슐화된 알고리즘을 멤버 변수로 포함 캡슐화된 알고리즘을 교환할 수 있음 Strategy 클래스 (인터페이스) 컴파일 시점에서 사용하는 캡슐화된 알고리즘을 나타냄 실제 .. 2021. 10. 13.
[JPA] 변경감지(dirty checking)와 병합(merge) 변경 감지와 병합 변경 감지 - 더티체킹 (엔티티의 값만 바꿔도 JPA가 알아서 update 쿼리) @Transactional 안에 this.setStatus(oderStatus.CANCEL);만 해도 자동으로 update 해줌 영속성 엔티티들에 적영됨. findById로 찾은 엔티티는 영속성 컨텍스트 Book book = itemRepository.findById(param.getId()); 디비에서 참조했기 때문 준영속 엔티티 영속성 컨테스트가 더이상 관리하지 않는 엔티티 엔티티 속성을 바꿔도 변경 감지를 통한 업데이트가 되지 않음. 엔티티를 그냥 Id로 접근한경우 book.setId(form.getId()) 병합 em.merge 디비에서 id 조회를 하고 필드를 모두 바꿔치기함. 준영속 상태를 영속.. 2021. 9. 6.
[JPA] 도메인 및 웹 계층 개발 회원 도메인 개발 엔티티매니저 createQuery 엔티티 객체를 대상으로 jpql 쿼리. 트랜잭션 기본적으로 데이터 변경은 트랜잭션 안에서 일어나야한다. - 서비스에서 메소드 트랜잭셔널을 붙이자 @Transactional javax와 spring중 spring을 import 하자, 기능이 더 많음 @Transactional(readOnly - true) 조회 기능에서 리드온니를 넣어주면 성능 증가. 기본적으로 서비스 클래스를 리드온리로 하고, 수정이 필요한 것에 @Transactional을 따로 붙임 기본적인 @Transactional은 readOnly = false 의존성 주입 @Autowired보단 생성자를 이용하는 방식 생성자만 있어도 스프링이 긱본적으로 @Autowired를 붙여줌 @Requir.. 2021. 9. 6.
[JPA] 도메인 분석 설계 및 아키텍처 도메인 분석 설계 설계 1:N에서 N이 주인. 외래키가 있는 곳을 주인으로 엔티티 클래스 개발 연관관계 주인이 아닌 경우 @OneToMany(mappedBy = "member") 상속 엔티티 상속 관계에서 상속 table type 전략을 정해줘야함. @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 자식들을 하나의 테이블에 생성 @DiscriminatorColumn(name = "dtype") @DiscriminatorValue("A") Enum @Enumerated(EnumType.String) 1대1 관계에서 주인? - 주인을 어디에 둬도 상관 없음 tip) access를 많이 하는 곳에 두자. N대N 관계 - 실무에선 X JoinColumn이 아닌 Jo.. 2021. 9. 6.
[JPA] SpringBoot JPA 프로젝트 설정 프로젝트 환경설정 프로젝트 생성 spring initializer 에서 프로젝트 생성 의존성 web, thymeleaf, jpa, h2, lombok 라이브러리 살펴보기 gradle -> dependencies 에서 확인할 수 있음 뷰 환경 설정 spring-boot-devtools 의존 화면 개발할 때 서버를 재부팅하지 않아도 화면 수정사항이 반영됨. build - recompile ~.html 해당 페이지만 리컴파일하면 수정 사항이 보임 데이터베이스 설정 h2 데이터베이스 설치 후 bin/h2.sh 로 실행 최초 실행시 jdbc:h2:~/jpashop으로 연결 (~/jpashop.mv.db 파일 생성) 이후 jdbc:h2:tcp://localhost/~/jpashop으로 연결 appliation.ym.. 2021. 9. 6.
[IntelliJ] 인텔리제이 빌드 변경 - gradle에서 intellij로, 스프링 부트 test 에러 별 이유도 없이 테스트가 안되고, 마땅한 에러도 알려주지 않습니다. 기본으로 그래들 빌드로 설정된 것을 인텔리제이 빌드로 바꿉니다. preference - buildTools - Gradle 다시 돌려보면 로그도 잘 뜨고 좋네요. 2021. 8. 24.
[IntelliJ] tdd 라이브 템플릿 1. preference에서 live template을 찾습니다. 2. 오른쪽에 +버튼을 누르고 Template Group을 Custom으로 추가합니다. 3. + 버튼으로 Custom 그룹에 Live template tdd를 추가합니다 4. 템플릿 코드를 입력합니다. 5. application context를 Java로 선택합니다. 코드는 다음과 같습니다 @Test public void test(){ //given //when //then } 자바파일에서 tdd를 입력하면 다음과 같이 템플릿이 생성됩니다. 2021. 8. 24.
[SpringBoot] 게시판 만들기 필요 클래스 및 동작 1. 도메인 패키지 Posts 엔티티 클래스 생성 데이터베이스와 맞닿은 핵심 클래스 수정이 최소로 되도록 보장해야함 Controller에선 Dto를 사용 JpaRepository을 상속받은 PostsRepository 인터페이스 생성 PostsRepository의 메소드로 Posts 생성과 조회 가능 2. Request 데이터를 받을 Dto 게시글 저장 PostsSaveRequestDto 클래스를 생성 게시글을 저장할 때, PostsRepository는 해당 Dto를 받아서 저장 Posts 엔티티와 필드가 동일 toEntity로 Dto를 PostsEntity로 변환하여 전달 3. 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service 각종 로직 처리 및 PostsRepository의 메소드를 실행 4.. 2021. 8. 17.