본문 바로가기

전체 글

(126)
테스트 코드에서 @Transactional 을 통한 롤백 사용시 주의점 들어가면서 테스트 코드를 작성하던 중 이해가 되지않는 신기한 오류를 만났는데 오류의 원인이 @Transcational 을 사용한 롤백이었습니다. @Transactional을 사용하면 간편하게 테스트에 사용한 데이터를 제거할 수 있고 삭제를 위한 코드를 제거할 수 있다는 장점 때문에 애용했지만 이번에 오류를 만나서 주의할 점을 알게 되었습니다. 에러 상황 에러가 발생한 테스트는 회원가입 API를 테스트할 때, 중복된 유저이름을 사용한 요청이 있다면 거부 응답을 반환하도록 하는 API를 테스트하는 테스트 코드에서 @Transactional 을 테스트 코드에 적용하면 테스트가 실패하지만 테스트 데이터를 @AfterEach 를 통해서 초기화하는 코드를 작성하는 경우에는 성공하는 상황 원인 테스트 코드에 적용된 ..
Spring 메일 전송기능 구현하기 들어가면서 회원가입 시에 이메일 인증 코드를 입력하는 요구사항을 구현하게 되었다. 메일 서비스는 오래전부터 제공하는 서비스이기 때문에 구현된 라이브러리가 있고 테스트를 위한 메일 서버 프로그램 역시 있다. 구현하는 방법을 알아보자! 구현순서 구현에 필요한 순서는 다음과 같다. 테스트를 위한 메일 서버 가동하기 라이브러리를 이용한 메일 로직 작성하기 테스트 메일 서버 가동하기 메일을 보내기 위해서는 메일 서버가 필요하지만 실제 서비스되는 메일 서버를 이용하여 개발하거나 테스트를 진행하면 불필요한 메일이 쌓여서 불편하다. 그렇다고 메일 전송 과정을 생략하고 메일 관련 로직을 테스트하기에는 전송 시에 예외가 발생하는 경우를 실행하여 테스트를 할 수 없어서 수동으로 메일이 전송되는지를 확인해야 해서 그리 탐탁지..
[Error] stream has already been operated upon or closed 코틀린에 익숙해지기 위해서 코틀린을 이용해서 알고리즘 문제를 풀고 있는데 stream has already been operated upon or closed 에러를 만났다. 원인 닫힌 스트림을 재사용 시도했다. class MinMax { fun solution(s: String): String { val numbers = s.split(" ").stream() .mapToInt { it.toInt() } val min = numbers.min() val max = numbers.max() return String.format("%d %d", min, max) } } 위의 코드는 에러가 발생하는 코드인데 여기에서 문제점이 스트림을 재사용하려고 했다는 점이었다. 스트림(데이터 파이브라인)을 사용하고 데이터..
Spring Security Test 작성하기 들어가면서 스프링 시큐리티를 적용하면 각 EndPoint를 접근할 때, 권한 인증은 어떻게 고려해서 테스트를 작성해야 하는지 고민이라면 읽어보는 것을 추천한다. 가짜 인증 만들어 인증/인가 단계 처리하기 시큐리티 테스트를 위해서 제공하는 어노테이션을 활용하면 임시로 인증 상태로 만들 수 있다. 1.@WithMockUser 시큐리티의 UsernamePasswordAuthenticationToken을 만들어서 주입해주는 어노테이션이다. 쉽게 말해서 인증된 유저를 설정하는 기능을 제공한다. @Test @WithMockUser public void getMessageWithMockUser() { String message = messageService.getMessage(); ... } 아무런 설정없이 사용하면..
EntityManager와 EntityManagerFactory에 대해서 JPA를 공부하다보면 EntityMananger를 알게되는데 이것이 무엇을 하는지 잘 모르고 사용을 했었다. 이번에 한번 역할을 알아보고 어떤 기능을 하는지 알아보자. EntityManager 의 역할? 엔티티를 관리하는 사람이라는 요놈을 이해화기 전에 엔티티가 무엇인지 알아야한다. 엔티티는 데이터 베이스와 연관이 깊은 용어이다. 엔티티는 유의미한 하나의 데이터 집합이라고 생각하면 된다. 예를 들어서 학생의 정보가 필요하면 학생의 정보를 담은 학생 엔티티를 조회하면 되고 수업의 정보가 필요하면 수업과 관련된 데이터를 담은 수업 엔티티를 조회하면되는 것이다. 애플리케이션에서 이런 데이터를 관리할 때, 객체 형태로 생성해서 관리하고 있으며 이들을 관리하는 객체가 EntityManager인 것이다. 역할은 무..
커스텀 Validation annotation 만들기 들어가면서 자주 사용하는 특별한 유효성 검사 로직을 분리해서 관리하고 싶을 때! 커스텀 유효성 어노테이션을 만들면 유용하다. 가독성도 향상되어서 코드를 읽기가 좋아지는 효과도 있어서 커스텀 유효성 검사를 구현하는 방법을 알게되어서 너무 좋았다! 커스텀 유효성 어노테이션을 만들기 위한 절차는 2가지가 있다. 커스텀 어노테이션 만들기 커스텀 로직 판별기 만들기 필요한 클래스 만들기 비밀번호를 검사하는 유효성을 구현하고 싶은 경우를 예시로 삼아서 설명하겠다. 우선 구현하고자 하는 클래스를 만들자! public @interface Password {} public class PasswordValidator{} 1. 커스텀 어노페이션 만들기 유효성 검사할 대상을 상대로 사용할 어노테이션을 만들자. @Target(..
[Spring security] SecurityContext, 접근 제한, 권한 제한에 대해서 들어가며 스프링 시큐리티에서 인증을 구현하기 위한 클래스의 역할을 중점으로 알아보자. 인증을 담당하는 요소들 interface description AuthenticationManager HTTP 필터 단계에서 요청을 수신하고 이 책임을 AuthenticationProvider에서 위임하는 책임을 지닌다. AuthenticationProvider 인증 방식(논리)를 책임하는 인터페이스로 로그인 방식에 따른 인증 방식이 존재한다. 인증 정보를 관리하는 요소 class description SecurityContext 인증된 사용자의 정보(Authentication)를 관리하는 문맥 SecurityContextHolder 요청(Thread)에 따른 사용자의 문맥을 관리하는 요소 하나의 스레드는 독립적인 문맥..
[Spring security] PasswordEncoder 살펴보기 들어가면서 도서 : 스프링 시큐리티 인 액션을 보고 내용을 정리한 글입니다. 자세한 내용은 책을 보는 것을 추천합니다. 이번 내용은 스프링 시큐리티의 암호화를 담당하는 모듈을 다루었다. PasswordEncoder 인터페이스 비밀번호는 민감한 정보이다. 외부에 노출이 된다면 중요한 정보를 탈취당할 수 있기 때문에 단단히 챙겨하는 정보이다. 이런 민감한 정보를 안전하게 보관하기 위해서 암호화를 하는데 스프링 시큐리티에서는 이런 암호화를 처리하는 역할을 인터페이스로 정의하고 있다. 바로 PasswordEncoder이다. 스프링 시큐리티를 적용하고 있다면 이 구현체 빈으로 등록하면 정의된 역할에 맞게 암호화를 적용할 수 있다. PasswordEncoder 구현체 BCryptPasswordEncoder, Arg..