springboot 52

[SpringBoot] Filter, Interceptor 개념 정리 및 로그인 처리

개요 기존 게시글에서는 쿠키와 세션 개념을 정리하면서 이 두 개념을 이용하여 로그인 관련 코드 적용도 해봤습니다. (https://jaimemin.tistory.com/1885, https://jaimemin.tistory.com/1886) 하지만, 로그인 처리를 할 때 쿠키와 세션만으로는 해결 안 되는 점이 있습니다. 예를 들자면, 로그인을 해야지만 접근 가능한 페이지들이 있을 때 쿠키와 세션만 적용했을 때는 해당 페이지 url을 직접 쳐서 들어갈 경우 그대로 화면이 노출된다는 문제점이 있습니다. 사실 시스템 요구사항에서는 로그인하지 않은 상태에서 해당 페이지들에 접근할 경우 우선 로그인 페이지로 리다이렉트 한 후 다시 그 페이지로 리다이렉트 하는 방식을 원할 것입니다. 여기서 필터와 인터셉터가 쓰이는..

Spring 2021.08.01

[SpringBoot] 쿠키, 세션을 이용한 로그인 처리

개요 지난번 게시글에서는 쿠키, 세션, 그리고 쿠키와 세션을 이용한 로그인에 대한 개념을 정리해봤습니다. (https://jaimemin.tistory.com/1885) [SpringBoot] 쿠키, 세션 개념 정리 개요 이번 포스팅에서는 로그인 기능을 구현할 때 꼭 필요한 개념인 쿠키와 세션에 대해 정리해보겠습니다. 실제 로그인과 관련된 코드 및 설명은 다음 글에서 정리하겠습니다. 쿠키 서버에서 jaimemin.tistory.com 이번 게시글에서는 코드와 함께 지난번 게시글에 대한 부가 설명을 진행하겠습니다. 1. 쿠키를 이용한 로그인 처리 지난 게시글 복습 서버는 로그인 요청이 성공할 경우 응답 헤더 내 Set-Cookie 필드에 사용자 정보 전달 쿠키를 전달받은 클라이언트는 이후 모든 HTTP 요..

Spring 2021.07.31

[SpringBoot] 쿠키, 세션 개념 정리

개요 이번 포스팅에서는 로그인 기능을 구현할 때 꼭 필요한 개념인 쿠키와 세션에 대해 정리해보겠습니다. 실제 로그인과 관련된 코드 및 설명은 다음 글에서 정리하겠습니다. 쿠키 서버에서 요청에 대한 응답으로 클라이언트로 전달해주는 정보 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청 시 서버로 전달하는 정보 위 두 정보는 HTTP Header에 저장이 됨 Set-Cookie: 서버에서 클라이언트로 쿠키 전달 Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청 시 서버로 전달하는 정보 쿠키 - 생명주기 Set-Cookie 내 expires라는 필드를 참고하면 쿠키 만료 날짜 및 시간을 알 수 있음 (GMT 기준) Set-Cookie 내 max-age 필드는 마지막 요청으로부터..

Spring 2021.07.29

[SpringBoot] Validation 간단 정리 - 2 (Bean Validation)

개요 기존에 공유한 Validtor의 경우 간단한 검증 기능조차도 코드로 작성했기 때문에 복잡하다고 느껴질 수 있습니다. (https://jaimemin.tistory.com/1874) 이에 따라 스프링에서는 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있는 Bean Validation을 제공하며 오늘은 이에 대해 정리해보고자 합니다. 1. Bean Validation 특정한 구현체가 아닌 Bean Validation 2.0(JSR-380)이라는 기술 표준 JPA가 표준 기술이고 그 구현체로 hibernate가 있는 것처럼 Bean Validation 또한 검증 애노테이션과 여러 인터페이스의 모음 대표적인 구현체로 hibernate validator가 있으며 보다 자세한 내용은 http://h..

Spring 2021.07.25

[SpringBoot] HV000232: No JSR 223 script engine found for language "javascript"

개요 Bean Validation 내 ObjectError을 적용하기 위해 @ScriptAssert 어노테이션을 적용했더니 아래와 같은 에러가 발생했습니다. HV000232: No JSR 223 script engine found for language "javascript" 원인 해당 에러의 원인은 자바 버전이 달라서 발생하는 문제였습니다. @ScriptAssert 어노테이션의 경우 Java 11에 최적화되어있는 듯 합니다. 실제로 JDK를 11로 적용하고 프로젝트를 빌드하면 아래와 같은 메시지를 볼 수 있습니다. Warning: Nashorn engine is planned to be removed from a future JDK release 해결방법 따라서, 결국 JDK를 11로 적용하고 프로젝트..

[DEV] 기록 2021.07.24

[SpringBoot] Validation 간단 정리 - 1 (BindingResult, Validator)

개요 실무 프로젝트를 경험하신 분들은 다들 공감하시겠지만 프로젝트 개발 과정에서 실제 개발에 투자하는 시간만큼 예외처리 및 validation을 진행합니다. 해당 게시글은 PRG 패턴을 예시로 들어 내용을 정리할 예정이며 PRG 패턴에 관해서는 아래 게시글을 참고해주세요. (https://jaimemin.tistory.com/1825) 게시글에서 다룰 케이스는 아래와 같습니다. (위에는 PRG 패턴 정상 케이스, 아래는 게시글에서 다룰 케이스) 회원가입 제약 조건 우선, 검증 및 예외처리를 하기 위해서는 회원가입을 진행할 때 제약 조건이 있어야 합니다. 따라서, Member 즉 회원 클래스에는 id, password, 그리고 생년을 나타내는 year 필드가 있다고 가정합니다. 각 필드에 대한 제약조건은 ..

Spring 2021.07.16

[SpringBoot] 세션이 만료될 때 세션 값 가져오는 방법

개요 유저가 로그아웃할 때 시간을 DB에 저장하기 위해 세션이 만료되기 직전 세션 내 attribute를 가져와 어느 유저인지 확인하고 해당 유저의 로그아웃 시간을 업데이트해야 했습니다. 해결방법 처음에는 ApplicationListener를 상속받은 후 LogoutSuccessEvent가 발생했을 때 유저 정보를 가져와 업데이트하는 방식으로 접근했는데, 해당 이벤트는 유저가 직접 로그아웃 버튼을 눌러야만 발생하는 문제점이 있었습니다. 저는 세션이 만료됨에 따라 로그아웃 되는 유저의 로그아웃 시간도 기록하고 싶었기 때문에 HttpSessionListener를 상속받은 뒤 sessionDestroyed 메서드를 오버라이드 하여 문제를 해결했습니다. LogoutSuccessEvent가 발생했을 때 호출되는 ..

[DEV] 기록 2021.04.24

도로명주소 OpenApi Thymeleaf + SpringBoot 연동

[개요] 올해는 더 이상 프로젝트를 진행하지 않을 줄 알았는데 거짓말처럼 새로운 과제가 생겼습니다. 이번에는 지도 기반 프로젝트를 진행해야 하기 때문에 도로명주소 OpenApi를 연동했어야 하는데 검색해본 결과 저처럼 Thymeleaf와 SpringBoot 환경에서 연동한 게시물이 없는 것처럼 보여 간단한 샘플 코드를 공유하고자 합니다. (사실 사이트에서 제공하는 JSP 파일을 남들처럼 그대로 적용해도 되지만 현재 프로젝트 환경이 thymeleaf를 사용하는 환경이고 타임리프와 JSP를 동시에 사용하기 위해서는 환경설정을 손봐야했기 때문에 아래와 같이 코드를 작성했습니다.) 먼저, 도로명주소 OpenApi를 사용하기 위해서는 도로명주소 개발자센터로 가서 API를 신청해야합니다. API를 신청 완료하면 키..

[DEV] 기록 2020.12.02

@Pattern 어노테이션을 통해 전화번호가 유효한 형태인지 검증

Input 값이 유효한 전화번호 형식인지 검증하기 위해 @Pattern 어노테이션을 사용했습니다. 정규문법을 이용하여 확인하는 것이고 작성방법은 아래와 같습니다. DTO @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Temp { // 전화번호 @NotNull @Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message = "10 ~ 11 자리의 숫자만 입력 가능합니다.") String telephoneNumber; } 여기서 핵심은 regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$" 이 부분입..

[DEV] 기록 2020.07.28