스프링/MVC 17

[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

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

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

스프링/MVC 2022.03.24

@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

API 구현시 `@PathVariable`로 id받아 자동 Entity 매핑하기

어떤 Entity를 조회할 때, id 값으로 받는 경우에 사용하면 편하다. @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; **//1번 우리가 예상하는 구현** @GetMapping("/getMember/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); } **//2번 Spring이 id로 자동으로 Member 삽입** @GetMa..

스프링/MVC 2022.02.24
1 2