스프링 46

[MVC 기초] 다형성을 활용해 동일 타입 구현체 선택적으로 사용하기 (Map, List + @Autowired로 동일 역할 구현체 자동으로 모두 담아오기)

상황 1. 할인 정책이 2가지가 있다. 하나는 무조건 1000원, 하나는 구매 금액 10퍼센트이다. 개발자 A씨는 경우에 따라 선택적으로 다른 동작을 취하게 하고 싶다. @Autowired로 의존성 주입받아 할인 interface의 구현체들을 Map or List에 받는다. (Map에 받을것임) 자동으로 주입된 할인정책 Map에서 원하는 구현체들을 꺼내어 원하는 상황마다 바꿔가며 사용할 것이다. 물론 클라이언트는 interface만 의존하고, 어떤 정책을 사용할지는 외부에서 인자로 받는다. 구현 Service단에서 로직을 구현했다. @Service class DiscountService { private final Map policyMap; private final List policies; //1. M..

스프링/MVC 2022.03.30

[MVC 기초] IOC, DI 의미와 DI컨테이너, 프레임워크의 특징

Spring의 다형성을 이용해 SOLID 객체지향에 손쉽게 맞춰주게 도와주는 Spring 프레임워크 기능인 IOC, DI에 대해 알아보자. IOC(Inversion of Control) 기존에는 new를 통해 클라이언트(개발자)가 스스로 어떤 구현체를 사용할 지 결정하였다. 문제점 개발자가 직접 구현체를 고르고 인스턴스로 선언하고 사용하게 되면, SOLID 원칙의 DIP 의존관계 역전 원칙 (Dependency inversion principle), 한 클래스는 추상체인 interface만 바라보고 개발을 할 수 있어야 한다. (구현체를 갈아끼워야 하므로) OCP 개방-폐쇄 원칙 (Open Close principle), 구현체를 new 하여 사용하게 되면, Runtime시에 구현체가 결정되는 Sprin..

스프링/MVC 2022.03.27

[MVC 기초] 객체 지향의 특징과 SOLID 원칙 + SPRING이 어떻게 다형성을 이용해 기존 한계를 극복했는가(좋은 객체지향 설계)

스프링 핵심 기능 (객체지향 프로그래밍을 도와준다.) 객체 지향 특징 추상화 캡슐화 상속 다형성 --> 유연하고 변경이 용이하게 만들기 때문에, 대규모 소프트웨어 개발에 많이 사용된다. -> 객체들의 모임으로 각각 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력) 컴포넌트 단위로 갈아끼우면서 쉽고 간단하게 조립. ( 다형성!!) 실전 다형성 역할 (interface) / 구현 (impl)으로 구분. 역할에만 맞으면 뭐든 구현은 교체 가능하다. (자동차 역할 -> 자동차, 뮤지컬 특정 역할 -> 어떤 배우) 유연, 변경 용이하다는 의미이다. 사용자(클라이언트)는 역할(인터페이스)만 알면 되어서, 구현 대상의 내부 구조, 변경, 구현 대상 자체 변경에도 영향을 받지 않는다. --> ex)자동차 오..

스프링/MVC 2022.03.24

[QueryDsl] QuerydslRepositorySupport 개선하여 더 쉽고 간결하게 Repository에서 Querydsl 사용하기 (Querydsl4RepositorySupport)

기존의 QueryDsl을 편하게 사용하기 위해 구현된 QuerydslRepositorySupport를, 직접 구현하여 더 강력한 기능을 가진 Querydsl4RepositorySupport를 제작하자. QuerydslRepositorySupport 기본 abstract 클래스란? @Repository public abstract class Querydsl4RepositorySupport Impl 객체들에 QueryDsl 사용을 서포팅 해주는 추상클래스이다. QuerydslRepositorySupport 기본 적용법 public class MemberTestRepository extends QuerydslRepositorySupport { public MemberTestRepository() { super..

스프링/QueryDsl 2022.03.23

[QueryDsl] QueryDsl + Paging & CountQuery 최적화

SpringData의 Page 인터페이스와 Pageable 인터페이스, 그리고 Page 구현체 public PageImpl(List content, Pageable pageable, long total) PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne) 로 경우에 따라 Count쿼리 최적화 를 사용한다. count 분리 안하고 한번에 조회 Pageable interface로 page,size,sort를 자동 매핑하여 사용하게 하고, getOffset(), getPageSize() 등으로 꺼내 queryDsl의 offset,limit 메서드등에 인자로 넣어준다. Page 객체로 return해주기 위해 PageImpl(실 retu..

스프링/QueryDsl 2022.03.22

[QueryDsl] SpringDataJPA (Interface)에 원하는 QueryDsl method 추가하기

SpringDataJPA는 interface로 상속받아 구현하는데, QueryDsl 메서드를 추가하려면 구현체가 필요하다. 기본적인 SpringDataJPA를 상속받은 interface Repository public interface MemberRepository extends JpaRepository { //select m from Member m where m.username = ? List findByUsername(String username);//naming 규칙으로 추가한 method } 그렇다면, 이 SpringDataJPA interface에 queryDsl 메서드를 추가하려면 어떻게? 🎁interface는 상속이 무한이라는 점을 이용한다. 방법 1. SpringDataJPA interf..

스프링/QueryDsl 2022.03.22

[QueryDsl] SpringDataJPA가 제공하는 QuerydslPredicateExecutor 인터페이스 사용해서 간단 Table Repository 기능 구현하기 (Predicate 직접삽입)

1.기존 SpringDataJpa Repository에 새로 QuerydslPredicateExecutor를 상속받는다. (인터페이스) public interface MemberRepository extends JpaRepository , MemberRepositoryCustom , QuerydslPredicateExecutor { //select m from Member m where m.username = ? List findByUsername(String username); } 기본적인 사용법 @Test public void querydslPredicateExecutorTest() throws Exception { QMember member = QMember.member; Iterable resul..

스프링/QueryDsl 2022.03.22

@Profile로 분리, 내부 static Class 로 TestCase 만들기 (@PostConstruct 사용)

구분 하고 싶은 file에 @Profile 선언 //local - dev - server 로 보통 분리를 하여서 Profile을 관리한다. @Profile("local") @Profile("test") yml에 별개로 선언 (test는 따로 같은 resource 경로 만들어줘서 test로 수정) local Profile로 실행 spring: profiles: active: local datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: 1234 driver-class-name: org.h2.Driver src\test\resources\properties.yml test Profile로 실행 spring: profiles: ..

스프링/MVC 2022.03.21

[QueryDsl] `JPA Repository + QueryDsl`로 동적 쿼리 & API 개발 구축 (Builder or 다중 Where 메서드)

순수 JPA Repository를 구축하여 QueryDsl 을 추가해본다. QueryDsl을 위한 JPAQueryFactory는 2가지 방법으로 주입 가능하다. @Bean으로 등록 후 @Autowired 생성자 주입 @Bean JPAQueryFactory jpaQueryFactory(EntityManager em) { return new JPAQueryFactory(em); } // 1. @Bean으로 등록 후 주입받기 // @Autowired // JPAQueryFactory queryFactory; or // 2. 생성자 주입받기 ( new) //public MemberJpaRepository(EntityManager em) { // this.em = em; // this.queryFactory = ..

스프링/QueryDsl 2022.03.21

[QueryDsl] sqlFunction 사용하기

보통 일반적인 내장 function들은 기본제공된다. 각 DB에 맞춘 Dialect에 선언된 Function들은 기본 제공되지만, 자기가 DB에 만든 Function은 기본 Dialect를 상속받아 만든 파일을 등록하고, yml같은 파일에 선언해줘야한다. H2Dialect에 선언된 기본 기능들 rtrim, space 등등 다양한 기능들을 제공한다. 기본 사용 기능중 replace 예제 @Test public void sqlFunction() throws Exception { //username의 memeber를 다 m으로 치환하는 Function List result = queryFactory .select( Expressions.stringTemplate("function('replace', {0}, ..

스프링/QueryDsl 2022.03.13
1 2 3 4 5