블로그

객체 지향 프로그래밍 입문(최범균) 3 - 분리, 의존 주입, DIP

<역할과 기능 분리 방법> 1. 패턴 적용 전형적 분리(아키텍처, 디자인패턴) 2. 계산 분리 로직의 기능화 3. 연동 분리 클래스 분리 4. 연속적인 if-else는 추상화 고민할 것   적절한 역할 분리는 테스트도 용이하게 한다.사용자와 직접적으로 관련된 기능은 내부 메서드로, 간접적으로 관련있는 기능은 별도의 클래스로 분리한다.   <의존> 순환 의존은 변경이 연쇄적으로 전파된다. 기능 변경의 파장이 커지면 안 좋기 때문에 의존은 적을수록 좋다. 의존대상의 기능이 많은 경우 클래스로 분리하거나 단일 기능으로 묶을 수 있는지 확인하라. 예를 들어 민원팩토리, 민원리포지토리를 민원등록으로 묶기   <스프링 의존 주입> 추상적 인터페이스를 의존하고, 의존 주입은 보통 생성자 방식으로 외부(스프링)에서 진행한다. 내부에서 new()로 생성하는 것과 반대이다. 1. 의존 대상이 바뀌면 그 대상을 조립하는 부분만 수정하면 됨 2. 대역 객체를 통해 테스트가 가능하다   <DIP 의존 역전 원칙> 고수준 모듈(기대수준), 저수준 모듈(단위적 실제 행위) 고수준 모듈을 의존해야한다. 반대로 고수준 모듈이 저수준 모듈을 의존하는 경우, 저수준 모듈이 변화할 때 고수준 모듈에 영향을 끼침 (목표를 향해 개발하는 것이 아닌, 개발에 따라 목표가 변하는 현상)고수준 모듈을 구현한 추상타입(인터페이스)을 저수준 모듈이 의존하는 방식을 추구해야한다.    

java강의최범균DIPDIinterface분리객체지향

spring repository 확장하기 with jpa, querydsl

JpaRepository 상속하는 repository interface 생성자동으로 빈 등록됨해당 repository는 의존주입 시 사용되는 repository public interface BoardRepository extends JpaRepository<Board, Long> {}   Querydsl을 사용하는 Custom Repository 생성 커스텀 리포지터리 interface 생성 public interface BoardRepositoryCustom { List<Object> findAll(); void updateAll(List<Long> ids, Boolean updatedStatus); } BoardRepository(JpaRepository)가 생성힌 Custom repository 또한 상속받도록 추가 public interface BoardRepository extends JpaRepository<Board, Long>, BoardRepositoryCustom {}   커스텀 리포지터리 확장 클래스 생성JPAQueryFactory는 별도로 빈등록 필요네이밍 시 repository + Impl 규칙을 사용하면 자동으로 빈등록 됨. @RequiredArgsConstructor public class BoardRepositoryImpl implements BoardRepositoryCustom{ private final EntityManager em; private final JPAQueryFactory jpaQueryFactory; @Override public List<BoardResponseDto> findAll(){ List<BoardResponseDto> results = jpaQueryFactory.select( Projections.constructor(BoardResponseDto.class, board.id, board.boardType, board.title, board.content, user.id, user.name, board.recruitingCnt, board.startDate, board.endDate, board.createdDate ) ) .from(board) .innerJoin(board.writer, user) .fetch(); return new results; } @Override public void updateAll(List<Long> ids, Boolean updatedStatus) { jpaQueryFactory.update(board) .set(board.updatedStatus, updatedStatus) .where(board.id.in(ids)) .execute(); em.flush(); em.clear(); } }  

다형성interfaceJPAQuerydsl확장repository

채널톡 아이콘