Java에서 클래스를 정의할 때, 보통 필드(field)와 그에 상응하는 접근자 메소드(getter, setter)를 함께 정의합니다. 이때, 자바 빈(JavaBean) 규약을 따르는 클래스라면, 필드와 메소드를 정의하는 작업이 번거로울 수 있습니다. 이러한 문제를 해결하기 위해 롬복(Lombok) 라이브러리에서는 @Data 어노테이션을 제공합니다. @Data 어노테이션이란? @Data 어노테이션은 롬복 라이브러리에서 제공하는 어노테이션 중 하나로, 클래스 내부에 정의된 필드에 대해 getter, setter, equals, hashCode, toString 메소드를 자동으로 생성해줍니다. 이렇게 생성된 메소드들은 모두 자바 빈 규약을 따르므로, 자바 빈 규약을 따르는 클래스를 간단하게 정의할 수 있습니..
Java 8부터 제공되는 Optional 클래스는 null-safe한 코드 작성을 도와주는 유용한 클래스입니다. Optional 클래스는 객체를 감싸서 그 객체가 null인지 아닌지 여부를 판단할 수 있습니다. ofNullable() 메소드는 Optional 객체를 생성하는 방법 중 하나입니다. 이번 글에서는 ofNullable() 메소드를 사용하는 방법에 대해 알아보겠습니다. ofNullable() 메소드란? ofNullable() 메소드는 null일 수 있는 객체를 Optional로 래핑하는 메소드입니다. ofNullable() 메소드는 null인 경우 Optional.empty()를 반환합니다. 다음은 ofNullable() 메소드를 사용하여 null인 경우 Optional 객체를 생성하는 예제입니..
로그인 기능을 완성하였으니 이제 게시판 기능을 구현해보겠습니다. 요구 사항 먼저 게시판 기능에 대한 요구사항을 정리하고 넘어가겠습니다. 게시판 기능에는 다음과 같은 항목들이 요구됩니다. 계층형 카테고리 물품 판매 게시글 CRUD 게시글 조건 검색 계층형 대댓글 게시글 별 쪽지 송수신 페이지 번호를 이요한 페이징 처리(게시글 조회) 무한 스크롤을 이용한 페이징 처리(쪽지 및 매매 내역 조회) 게시판 기능의 최종 목표는 회원들이 게시글을 작성하고 댓글을 달아 소통할 수 있도록 하는 것입니다. 계층형 카테고리 카데고리는 계층형 구조 입니다. 각각의 카테고리는 하위 카테고리를 가질 수 있습니다. Category Entity 생성 @Entity //JPA Entity임을 나타내는 어노테이션 @Getter // C..
자바에서 Function은 함수형 프로그래밍을 지원하는 인터페이스입니다. Function 인터페이스는 하나의 인자를 받아들이고, 하나의 값을 반환합니다. 이번 포스트에서는 자바 Function 인터페이스에 대해 자세히 살펴보겠습니다. Function 인터페이스 Function 인터페이스는 다음과 같이 정의됩니다. public interface Function { R apply(T t); } Function 인터페이스는 제네릭 인터페이스로, T는 입력값의 타입, R은 반환값의 타입을 나타냅니다. apply 메서드는 Function 인터페이스의 인자를 받아들이고 반환값을 생성합니다. Function 사용 예시 문자열을 대문자로 변환 Function toUpperCase = (str) -> str.toUppe..
이번에는 저번 시간까지 만들었던 로그인 API에 대한 문서를 만들어 보겠습니다. Swagger를 활용해서 API문서를 만들어볼건데요, Swagger에 대한 내용은 다음 포스팅을 읽어봐주세요. https://coding-kim.tistory.com/37 [Spring] Swagger에 대해서 알아보자 Swagger는 RESTful API 문서화를 위한 도구로, API의 사용 방법과 API의 매개변수, 반환값 등을 문서로 정리해주는 역할을 합니다. 이번 글에서는 Spring Framework에서 Swagger를 사용하는 방법을 소개하겠습 coding-kim.tistory.com Swagger 추가 Swagger를 사용하기 위해 build.gradle에 의존성을 추가하겠습니다. dependencies { im..
Swagger는 RESTful API 문서화를 위한 도구로, API의 사용 방법과 API의 매개변수, 반환값 등을 문서로 정리해주는 역할을 합니다. 이번 글에서는 Spring Framework에서 Swagger를 사용하는 방법을 소개하겠습니다. Swagger 추가 먼저 Swagger를 사용하기 위해 build.gradle 파일에 다음과 같이 의존성을 추가합니다. dependencies { implementation 'io.springfox:springfox-swagger2:2.9.2' implementation 'io.springfox:springfox-swagger-ui:2.9.2' } Swagger 설정 Swagger를 사용하기 위해서는 @Configuration 어노테이션이 붙은 설정 파일을 작성해..
이번에는 Token 관련 코드에 대해서 리팩토링을 진행해 보겠습니다. 문제 현재 프로젝트에서는 JwtAuthenticationFilter 클래스와 SignService 클래스에서 Token Service를 이용하여 token 생성, 추출, 검증 기능을 사용하고 있습니다. 그런데 TokenService 클래스를 살펴보면 /* access */ public String createAccessToken(String subject) { return jwtHandler.generateJwtToken(accessKey, subject, accessTokenMaxAgeSeconds); } public boolean validateAccessToken(String token) { return jwtHandler.val..
이번에는 이전 시간에 만든 인증 로직을 테스트 해보겠습니다. 원래대로라면 코드만 보여드리고 설명을 생략하겠지만 이전에 만든 인증 로직에 대한 이해를 돕고자 테스트를 따로 준비했습니다. 테스트를 진행하기에 앞서 데이터베이스 초기화를 위한 TestInitDB를 생성하겠습니다. 데이터베이스 초기화 @Component public class TestInitDB { @Autowired RoleRepository roleRepository; @Autowired MemberRepository memberRepository; @Autowired PasswordEncoder passwordEncoder; private String adminEmail = "admin@admin.com"; private String mem..
이번에는 로그인 관련하여 인증 로직을 추가해보겠습니다. 전체적인 인증 로직은 다음과 같습니다. 클라이언트가 API 를 요청한다. 요청시에 로그인해서 발급받은 access token을 HTTP Authorization 헤더에 담아서 보내준다. JwtAuthenticationFilter에서 토큰을 검증하고, 토큰으로 요청한 사용자 정보를 데이터베이스에서 조회해서 SecurityContext에 저장한다. 요청한 API url에 따라서 접근 허용 여부를 검사한다. 접근에 성공하면 요청한 API url에 따라 Controller에서 작업을 수행한다. 접근에 실패하면 인증되지 않은 사용자의 경우 401응답을 내려주는 곳으로 redirect 요청한 자원에 접근 권한이 없는 경우 403응답을 내려주는 곳으로 redir..