스프링 공부 77

@뭐시깽이Constructor

프로젝트를 만들다보면, 필요에 따라 AllArgsConstructor, RequiredArgsConstructor, NoArgsConstructor를 보게된다. 이에 대해 머리를 한번 정리하고 가야할 필요가 있다고 생각이 들어서, 하나씩 정리를 해보려고 한다. @AllArgsConstructor 클래스의 모든 인스턴스를 가지는 생성자를 자동적으로 만들어주는 역할을 한다. @RequiredArgsConstructor AllArgsConstructor와 비슷하게 모든 인스턴스를 가지는 생성자를 자동적으로 만들어주지만, @NonNull과 같은 특별한 제약조건을 가지게 되며, 이러한 조건들을 지키기 않을 경우 Exception을 던진다. @NoArgsConstructor 변수 없는 생성자를 만들어준다. 그런데,..

@JsonInclude

백엔드를 공부해본 사람은 알 것이다. 모든 프로젝트의 데이터는 Json 타입으로 넘어간다. 그래야 프론트엔드에서 이를 받아 출력문을 만들기 수월해진다. 이렇게 Json타입으로 넘어가는 데이터를 관리하는데에 쓰이는 어노테이션중 하나가 JsonInclude이다. 객체에 데이터가 존재하고, 이 객체가 Json타입으로 넘어가 인스턴스들을 데이터로 가지고 프론트엔드로 간다. 이 때, 넘어가는 데이터에 Json으로 어떤 것들이 넘어가는지를 정할 수 있다. 그러면 어떻게 그 데이터들을 정할 수 있을까? @JsonInclude가 없고 해당 객체의 데이터를 프론트엔드로 넘기면, 데이터가 어떤 상태건 모든 데이터가 Json으로 프론트엔드로 넘어간다. 이 때 어노테이션과 괄호에 추가 설정을 통해 어떻게 데이터를 넘길지 정할..

[스프링] 4. SecurityConfig에 대한 유틸 추가하기

저번 게시글까지 SecurityConfig를 만들고, 이에 대해 간단한 설정을 해두었다. 문제는, 모든 과정이 시큐리티 필터 체인에 맞게 돌아가지 않을 수 있다. 사진을 보면 인증정보, 즉 Authentication은 SecurityContextHolder에서 SecurityContext를 찾아, 그 속에서 Authentication을 가져와 확인하게 된다. 즉, 우리(서버)가 사용자(클라이언트)에게 토큰을 주었을 때, 그 토큰을 그대로 저장하는 것이 아닌, 그 토큰에서 우리가 필요한 정보를 가져와 이를 확인하는 방식이다. 또한, 이 토큰은 암호화되어있는게 기본적인 약속이다(털리면 위험하니까) 그렇다면, 우리는 토큰을 검증할 때 어떻게 해야할까? 복호화 -> 필요한 정보 가져오기 -> 정보가 있는지 확인..

@Log(@Slf4j를 써보다가 궁금해서 찾아본 내용 정리)

이게 뭘까? 사실 다른 어노테이션들은 이름을 보면 간단하게 뜻을 유추해볼 수 있거나, 구글링해야할 단어들을 명확히 알 수 있다. 그런데 이건 진짜 모르겠다. 그대로 복사해서 구글링을 해보기도 했다(진짜 별다줄이라는 말이 괜히 있는게 아니다) 근데, 구글링 하기 전에 항상 들어가보는 곳이 있다. package lombok.extern.slf4j; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Causes lombok to generate a logger fi..

[스프링] 3. swagger ui 적용시키기(2)

현재까지 따라왔다면, 바로 실행하면 이상한 과정을 거치게 된다. 1. 로그인이 생겼다 이렇게 로그인이 생겼는데, 이는 Spring Security에서 기본적으로 제공하는 로그인 기능으로, 여기에 아이디와 비밀번호를 쳐야한다. 근데 회원가입을 안했잖아?? 요런식으로 콘솔을 찾아보면 비밀번호가 알려지는데 아이디에 user, 비밀번호에 여기 부분을 붙여넣으면 된다. 그러면 되냐고? 안된다. 이 부분을 조금 더 설명을 해야할 것 같다. Swagger UI를 우리가 쓰는 이유는, API 명세서를 자동으로 만들어줄 수 있다는 장점이 있고, 조금 더 정리된 상태에서 내가 만든 기능들을 확인할 수 있기 때문이다. 그런데 Spring Security는 우리가 설정하지 않으면, 만들어둔 프로젝트의 모든 페이지를 보안화시킨..

[이론정리] 스프링 시큐리티의 체인 구조 및 동작 방식

필터 체인 부터 설명을 하자면, 스프링에는 많은 필터가 존재한다. 이를 하나씩 훑어보자. SecurityContextPersistenceFilter - 요청(request)전에, SecurityContextRepository에서 받아온 정보를 SecurityContextHolder에 주입한다. LogoutFilter - 유저의 로그아웃을 진행한다. UsernamePasswordAuthenticationFilter - 주어진 아이디와 비밀번호로 로그인 인증을 진행한다. DefaultLoginPageGeneratingFilter - 추가된 로그인 방식이 없다면, 스프링 기본으로 로그인을 처리한다. BasicAuthenticationFilter - HTTP 요청의 (BASIC)인증 헤더를 처리하여 결과를 Se..

[스프링] 2. swagger ui 설정하기(1)

일단 Swagger 를 써야하는 이유에 대해 간단히 생각해보고 코드를 정리해야겠다. swagger는 api를 정리해서 관리하고, 확인하기 편하게 해준다. swagger ui를 통해 url 주소에서 적혀있는 path와, 요청의 method들을 정리해 보여준다. 이를 통해 내가 만든 페이지가 어떻게 되어있고, 분류나 기능들을 한번에 볼 수 있다. 코드를 정리해보자면, 계층적으로는 api apiInfo apiKey securityContext defaultAuth 로 이루어져 있으며, 코드는 아래와 같다. @Import(BeanValidatorPluginsConfiguration.class) @Configuration @EnableWebMvc // http://localhost:8080/swagger-ui/i..

[스프링] 1. CORS 설정해주기

일단 프로젝트를 만들 때, 버전 2.7.0에 자바는 버전 11로 맞추어주었다. 주변에서 듣기로는 제일 실무에서 많이 쓰인다고 들었기 때문이다(소문) implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.projectlombok:lombok:1.18.22' implementation 'mysql:mysql-connector-java' compileOnly '..

@Bean

정의 Spring IOC Container에 해당 Spring Bean을 등록시켜 사용하게 한다. Bean은 스프링에 의해 생성되고 관리되는 객체들을 말하며, 여기에 다른 객체를 추가할 때 @Bean 어노테이션을 넣어 객체를 추가시킬 수 있다. 여태까지 공부했던 과정에서는, @Configuration어노테이션을 넣은 클래스를 스프링 설정에 사용할 수 있으며, 여기에서 사용할 객체들을 @Bean어노테이션과 메서드를 통해 스프링 빈으로 등록해, 사용할 수 있다. 특징 @Component, @Bean 두가지 방식이 있다. @Component 컴포넌트로 설정해준다는 뜻이며, 이 때 ComponentScan을 통해 어디서부터 컴포넌트를 불러와 사용할지 등을 정해주어야 한다. @Bean 스프링 빈에 자동 등록되어,..

@Configuration

정의 Congifuration은 설정을 만들거나, 내부에 @Bean을 만들기 위해 클래스에 적용시키는 어노테이션이다. 클래스에 Configuration 어노테이션을 등록하면 해당 클래스를 설정에 대해 사용해줄 수 있고, @Bean을 통해 SpringBean을 등록할 수 있다. 특징 @Configuration을 통해 해당 클래스가 설정에 대한 파일임을 알 수 있다. 내부의 메서드(Bean으로 호출된)을 가져올 경우, 클래스를 호출해 내부의 메서드를 호출하는 방식이 아닌, 메서드만을 호출하는 방식이다. 또한, 내부에 @Bean을 통해 Spring Bean을 등록할 것임을 알 수 있다. 주의점 : @Configuration은 Bean을 등록하기 위한 어노테이션이라는 것은 아니다. 방식 public class ..