카테고리 102

[JPA 기초] 기본 Entity 설정시 사용되는 annotation 정리

@PersistenceContext 이 어노테이션이 있으면 EntityManager가 주입된다. build.gradle의 jpa보고 yml 파일 읽어서 설정된 대로 만들어서 DI 해줌. EntityManger 객체는 JPA에서 CRUD를 호출하는 기능 @Repository public class MemberRepository { /*이 어노테이션이 있으면 EntityManager가 주입된다. jpa보고 yml 파일 읽어서 */ @PersistenceContext private EntityManager em; @Embeddable (내장타입 대상 클래스의 상단) @Embedded (내장타입을 사용하는 객체의 변수 설정 위) Jpa의 내장타입이란 뜻입니다. Jpa에서 domain 생성시 경우에 따라 안에 들..

스프링/JPA 2022.04.05

[모던자바인액션] 2. 스트림 정리

스트림 Collection이란? 자바에서는 이 Collection으로 데이터를 그룹화하고 처리한다. 모든 요리의 칼로리 합이라던지, 칼로리가 50 이하인 음식을 고른다던지 하는 식이다. 데이터베이스에서는 선언형으로 SELECT name FROM dishes WHERE calorie 이런 식으로 구현한다. 위에서 봤듯, SQL 질의는 요리의 속성을 이용하여 어떻게 필터링할 것인지 구현할 필요가 없다. (자바처럼 반복자, 누적자 등을 이용하는 것) 자바 8에서는 이런 식으로 Collection을 처리하고 싶었다. 성능 좋게 멀티코어 아키텍처를 활용해서 병렬적으로. 그렇기에 스트림은 탄생했다. 스트림이란? 스트림을 이용하면 선언형 (즉, 데이터를 처리하는 임시 구현 코드 대신 질의로 표현)으로 Collecti..

개발언어/JAVA 2022.04.05

[모던자바인액션] 1. 람다 정리

람다 람다란? 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 익명 보통 메서드와 달리 이름이 없어 익명 함수 람다는 메서드처럼 특정 '클래스'에 종속되지 않아 함수라고 칭한다. (but, 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함) 전달 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 익명 클래스처럼 자질구레한 코드를 구현할 필요가 없다. 람다를 사용하여 코드를 전달하는 과정에서 판에 박힌 코드를 구현할 필요가 없게 만들어준다. (동작 파라미터 형식의 코드를 더 쉽게 구현할 수 있다) 결과적으로 코드를 더 간결하고 유연하게 만들어준다. ex) //기존 Comparator byWeight = new Comparator() { p..

개발언어/JAVA 2022.04.05

[MVC 기초] 빈 스코프 @Scope 생존 범위 설정 방법 + Prototype, 웹 스코프를 어떻게 Spring에서 Proxy 객체로 다형성을 지키며 개발하는지 (LAZYLOADING)

싱글톤은 너무나 알기 쉽기 때문에 생략하고, 특정 경우에 사용할 다른 종류를 알아보자. 프로토타입 빈 생성 요청마다 DI컨테이너가 계속해서 새로운 인스턴스를 생성해주는 것. ( = 클라이언트가 요청마다 새로운 인스턴스 생성) 💥DI 컨테이너는 빈 인스턴스 생성, 의존관계 주입과 초기화 단계까지만 처리한다. 이후 스프링은 어떻게 처리하던 클라이언트에게 위임.(관리 안한다는 뜻) -> 따라서 @PreDestroy 호출 안됨. 클라이언트가 수동으로 종료해줘야 한다. @Test void prototypeBeanFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); Syst..

스프링/MVC 2022.03.31

[MVC 기초] 빈 라이프 사이클 이용해서 의존관계 (기본 @PostConstruct, @PreDestroy + 수정 불가한 외부 라이브러리의 빈 생성, 파괴시에 동작시키는 방법)

특정 빈을 Spring에 등록하고, 그 빈의 의존관계가 주입된 후(완전히 생성된 후) 무언가 작업을 하고, 삭제 전에 어떤 작업을 하고 싶을 때가 있다. 기본적으로 @PostConstruct, @PreDestroy 사용을 하면 된다. 그러나 외부 라이브러리를 사용할 때도 있는데, 이럴 때는 내부 코드를 수정할 수 없으므로 수동으로 @Bean 등록시에 특정 메서드의 이름을 생성후, 소멸전 메서드로 등록을 해줘야 한다. 스프링 빈의 라이프 사이클 기본적인 @PostConstruct, @PreDestroy의 동작 시점은 아래와 같다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> @PostConstruct -> 사용로직 -> @PreDestroy -> 스프링 종료 // 기본 어노테이션 사..

스프링/MVC 2022.03.30

[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

프로젝트 설계법

프로젝트를 시작할 때, 해당 프로젝트의 서비스 단위로 설계할 때 도움이 되기 위해 작성했다. 보통 기업에서 새 프로젝트를 진행할 때보다는 개인적으로 토이 프로젝트를 진행할 때, 체계적으로 진행했으면 좋겠다는 생각을 가지고 있어서 설계에 신경을 더 쓰고 싶어서 정리했다. + 이후 JPA 도메인 설계도 추가할 생각이다. 도메인 협력 관계 -> 기획자들도 볼 수 있는 그림 클래스 다이어그램 -> 개발자가 도메인 협력관계를 구체화해서 클래스로 만든다.(실제 실행하지 않고 class만 분석해서 그릴 수 있다.) 객체 다이어그램 -> 어떤 구현체가 사용될지는 서버가 실행되어야 선택되어 알 수 있기 때문에, client가 실 사용하는 구현체들을 그린다.

CI&CD 2022.03.25

[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