본문 바로가기

스프링

(11)
[Spring Security] 스프링 시큐리티란? 스프링 시큐리티에 대해서 알아보기 전 간단하게 개념 확인하겠습니다! 🎨 What is Servlet? 웹 기반의 요청에 대해 동적으로 처리해주는 역할입니다. 해당 URL에 기반한 HTTPservletRequest를 생성하고 response 결과를 전송합니다. request 객체에 있는 정보들을 꺼내서 사용, response 객체에 정보를 편리하게 입력 🎨 What is Servlet Container? 서블릿은 요청을 받거나 내보낼 때, 자신이 알아서 하는 것이 아니라 서블릿을 실행시키는 주체인 서블릿 컨테이너라는 것을 이용합니다. 즉, Servlet을 관리한다는 Servlet Container는 어떤 요청에 대해 어떤 Servlet을 실행할 것인지 제어하는 것이죠. 더 쉽게 말하면,, 서블릿이 웹서버와..
Lombok 라이브러리의 @RequiredArgsConstructor 롬복과 최신 트랜드 막상 개발을 해보면, 대부분이 다 불변이고, 그래서 다음과 같이 필드에 final 키워드를 사용하게 된다. 그런데 생성자도 만들어야 하고, 주입 받은 값을 대입하는 코드도 만들어야 하고...(매우 귀찮다) 필드 주입처럼 좀 편리하게 사용하는 방법은 없을까? -> 롬복으로 해결 가능하다! [롬복 추가] 프로젝트 시작할 때 롬복을 설치하지 않았기 때문에 build.gradle에 다음과 같은 코드를 추가하자(처음에 롬복을 추가했으면 이 과정을 뛰어넘어도 된다) //lombok 설정 추가 configurations{ compileOnly{ extendsFrom annotationProcessor } } dependencies { implementation 'org.springframework..
의존관계 주입 4가지 방법과 생성자 주입 권장 이유 다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 방법이 있다. (1) 생성자 주입 (2) 수정자 주입(setter 주입) (3) 필드 주입 (4) 일반 메서드 주입 [1] 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 지금까지 우리가 진행했던 방법이 바로 생성자 주입이다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memb..
@ComponentScan과 @Autowired 스프링은 설정 정보가 없어도 1) 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 2) 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. ✔️ 컴포넌트 스캔의 필요성 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열하는 방법이 있다. 하지만 등록해야 할 스프링 빈이 많아진다면 하나씩 다 입력하는 것은 한계가 있고 누락할 가능성도 있다. => 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. ✔️ 컴포넌트 스캔 방법 ✏️[ 1 ] 다음과 같이 설정 정보 클래스에 @ComponentScan 어노테이션을 붙이면 된다. @Configuration @Comp..
@Configuration의 싱글톤 보장 스프링을 배우면 "스프링이 ~하게 관리해준다."와 같이 뭘 알아서 해준다는 것을 많이 들어봤을 것이다. 필자는 '스프링이 알아서 다 해준다고?? 어떻게??' 라는 의문점이 있었다. 뭐 스카이캐슬에 김주영쌤 같은 느낌 하지만 @Configuration 을 배우면서 어떤 식으로 스프링이 관리해준다는 말의 의미를 깨닫게 되었다. 앞으로 이어질 @Configuration에 대한 내용을 통해 독자도 필자와 같은 깨달음을 이해할 수 있길.. @Configuration 을 적용한 AppConfig에는 놀라운 비밀이 있다. @Configuration 을 붙이면 바이트코드를 조작하는 CGLIB 기술을 사용해서 싱글톤을 보장한다. 사실 개발자가 AppConfig라는 설정 정보를 입력하더라도 @Configuration 을 ..
싱글톤 방식 주의점_무상태(stateless) 싱글톤 방식의 주의점!!(완전 중요) 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 💡 무상태(stateless)로 설계해야 한다! 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다! 가급적 읽기만 가능해야 한다.(가급적 수정하지 않도록 해야 한다) 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!! [상태를 유지할 경우 발생..
싱글톤 패턴과 스프링 컨테이너 👍 웹 애플리케이션과 싱글톤 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. (물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다.) 웹 애플리케이션의 특성 중 하나는 '여러 고객이 동시에 요청을 한다'는 것이다. 만약 요청을 할 때마다 객체가 생성된다면 3명의 사람이 memberService에 대한 요청이 있을 때 객체 3개가 만들어진다.( 만약 요청이 1초에 5만개라면 객체가 5만 객체가 생성되어야 한다. 비효율적이다.) 전 포스팅에서 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때 마다 객체를 새로 생성한다. 아래의 코드는 순수한 DI 컨테이너이며, 요청마다 객체를 생성하는 것을 구현하여..
스프링 컨테이너와 스프링 빈 스프링 컨테이너란? : 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할 스프링 빈이란? : 자바 객체를 스프링에서는 빈(Bean)이라고 부름 컨테이너와 빈이라는 걸 계속 개념 정리는 해왔지만 확 와닿지 않는다. 컨테이너가 뭐지?.. 공사장 근처에 있는 회색 컨테이너가 생각난다.빈?? 원빈인가?ㅋㅋ 다음 스프링 컨테이너를 생성하는 과정을 통해 개념을 더 잘 이해해보도록 하자! ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 위의 코드는 스프링 컨테이너를 생성하는 코드인데 여기서 ApplicationContext 를 '스프링 컨테이너'라 한다...
[CORS 에러] 멘붕의 CORS 에러 [2023.5.24 추가] - 3기 백인턴 분들을 위해 하단에 간단하게 작성한 부분이 있으니 참고해주세요! 스프링 어린이 + 제대로 된 프로젝트가 처음이었던 나는 어느 날 프론트에게 CORS 에러가 나서 해결해주실 수 있냐고 문의를 받았다. 시큐리티 부분도 소화하기 어려웠는데 CORS 문제까지 있다니! 다행히 같이 모각코하던 백엔드 인턴분께서 좋은 블로그를 찾아주셔서 해결할 수 있었다. 신기하게 그 작성자님이 학교 선배님이셨다는 놀라운 이야기...최고최고!!! 덕분에 해결했습니다ㅜㅜ 감사합니다!!! 👍👍👍 https://myunji.tistory.com/515 [Spring] Spring Security PostMan에서 잘 되던 api가 프론트에서 cors 에러를 띄운다면 현재 프론트로 React를 쓰..
[JWT] Access Token 재발급 문제 프론트와의 커뮤니케이션 처음에는 어디까지가 프론트의 부분이고, 어디까지가 백엔드의 부분인지 정확하게 알지 못했다. 그냥 api 문서를 보고 어떤 것들을 주고 받는지만 알았다. 하지만 스프링 시큐리티 부분에서 진정한 프론트와의 커뮤니케이션을 하게 되었고 개발을 할 때 프론트가 어디까지 할 수 있는 지 알고 있어야 겠다는 깨달음을 얻었다. 🧐Access Token 관련 재발급 문제 백엔드에서 로그인 기능을 구현하기 위해 JWT를 이용하여 access 토큰을 발행하고 refresh 토큰을 이용하여 accessToken을 재발급하는 방법으로 accessToken의 만료로 인한 재로그인의 불편함을 줄이고자 했다. 이 글은 Access Token 재발급 문제에 대해서 어떻게 커뮤니케이션을 했는지에 대한 과정을 담고..