스프링 부트를 이용하여 2가지 프로젝트를 진행해보고 나서 문득 스프링에 대한 기초가 궁금해서 수강한 강의이다. 비전공자이다 보니 기초가 아무래도 부족하지 않나 싶은 생각도 들었고, 사실 워낙 유명한 분의 강의이다 보니 궁금한 게 컸다. 대부분 부트캠프에서 배웠던 내용들이라 새롭게 배웠다기보다는 복습을 한 기분이다. 그때 당시에는 IoC, DI 등 이러한 용어적인 부분들이 배우면서도 와닿지 않았었다. 프로젝트를 진행하면서, 이런 저런 기능도 추가하고 구현하면서 어렴풋이 알게 되었던 것 같다. 좋았던 점은 과거의 스프링이 없던 시절부터 점점 현대로 발전해 오는 과정에서 왜 이러한 기능들이 생겨났는지와, 왜 이러한 기능들이 필요한지에 대한 이유들에 대한 설명이다. 그러한 과정을 코드로 보여준다. 예를 들어, ..
스프링 빈의 이벤트 라이프사이클 스프링컨테이너생성 -> 스프링빈생성 -> 의존관계주입 -> 초기화콜백 -> 사용 -> 소멸전콜백 -> 스프링종료 초기화 콜백 : 빈이 생성되고, 의존관계 주입이 완료된 후 호출 소멸전 콜백 : 빈이 소멸되기 직전에 호출 Spring은 크게 3가지 빈 생명주기(Bean LifeCycle) 콜백을 지원합니다 인터페이스(InitializingBean, DisposableBean) 설정 정보에 초기화 메서드, 종료 메서드 지정 @PostConstruct, @PreDestroy 애노테이션 지원 1. 인터페이스(InitializingBean, DisposableBean) 먼저 인터페이스를 사용하는 방법을 알아보겠습니다. package hello.core.lifecycle; impor..
Spring 관련해서 요즘 기초부터 다시 보고 있는데 생성자 주입에 관해서 보고 있던 중, 흥미로운 부분을 발견했다. 수정자 주입과 필드 주입이다. (옛날에는 수정자 주입, 필드 주입을 많이 사용했었다고 한다) 수정자 주입 선택, 변경의 가능성이 있는 의존관계에 사용한다 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다 set메서드를 public으로 열어둬야 한다 (누군가 변경가능성 있음) @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; @Autowired public void..
싱글톤 패턴이란? 하나의 인스턴스만 생성하여 사용하는 디자인 패턴 (클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴) 사용법 static 영역에 객체 instance를 하나 미리 생성한다 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있도록 한다 (이 메서드는 항상 같은 인스턴스를 반환함) 오직 하나의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막아준다 public class SingletonService { // static 영역에 객체를 "1개"만 생성해둔다 private static final SingletonService instance = new S..
SOLID 클린코드로 유명한 로버트 마틴이라는 사람이 정리한 좋은 객체 지향 설계의 5가지 원칙 SRP : 단일 책임 원칙 (Single responsibility principle) OCP : 개방-폐쇄 원칙 (Open/closed principle) LSP : 리스코프 치환 원칙 (Liskov substitution principle) ISP : 인터페이스 분리 원칙 (Interface segregation principle) DIP : 의존관계 역전 원칙 (Dependency inversion principle) SRP 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 함 하나의 책임이라는 것이 모호함 클 수 있고, 작을 수 있음 문맥과 상황에 따라 다름 중요한 기준은 변경이다 변경이 있을 때 파급..
JPA를 이용해 간편하게 메서드 네이밍을 사용하던 중 문제가 발생했다 A and (B or C)를 찾는 메서드를 만들어야 하는데 어렵다... 사실 그냥 쿼리를 만들면 쉽긴 하다만JPA메서드네이밍만으로 할 수 있을 것 같아서 도전해 봤다 Page findAllByProductCategories_Category_CategoryIdAndNameContainsOrProductCategories_Category_CategoryIdAndBrandContains(long categoryId1, String name, long categoryId2, String brand, Pageable pageable); ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 만들고 보니 어이가 없다 ㅋㅋㅋ 그래도 약간의 ..
캐시 사용 서버의 부담을 줄이고 성능을 높이기 위해 사용되는 기술 DB에서 조회하는 게 오래 걸리는 작업에 적용하여 해당 결과값을 저장해 두고 가져옴으로써 빠르게 처리가 가능해짐 동일한 결과값이 매번 자주 호출되는 작업에 적용하면 유리하다 -> 결과값이 매번 다른 작업에 적용한다면 캐시를 확인하는 작업으로 인한 부하가 생겨 성능이 오히려 떨어질 수 있으니 주의하여 사용한다 Spring Cache (@Cacheable) 간단 사용법 1. gradle 종속성 추가 implementation 'org.springframework.boot:spring-boot-starter-cache' 2. @EnableCaching 설정 캐시 기능을 사용할 애플리케이션에 @EnableCaching 어노테이션을 붙여준다 @Sp..
클라이언트 측에서 Header에 Jwt 토큰을 실어 보내면 해당 정보를 볼 수 있는 방법을 간단하게 알아보겠습니다. 커스텀 애너테이션 @Login이라는 커스텀 애너테이션을 만들어서 UserDetails 객체에 받아온다 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) @AuthenticationPrincipal public @interface Login { } @GetMapping public void getJwtEmailTest(@Login UserDetails userDetails) { System.out.println("@Login : " + userDetails.getUsername()); } @AuthenticationPrin..