make it simple
article thumbnail
중복 데이터로 인한 Single{}의 IllegalArgumentException
Kotlin 2023. 8. 23. 21:08

문제 운영하는 프로젝트 기능 중에 익명 게시판이 있다. 한 게시글에 익명인 사람이 여러개의 댓글을 올려도 같은 익명 닉네임으로 표시해야한다. 익명 댓글을 입력하는 비즈니스 로직은 밑과 동일하다. 한 게시글에 같은 유저가 두개의 익명 닉네임을 가지고 있으면 안된다. 익명 여부를 포함한 게시글을 저장한다. 익명 닉네임(Community_Nickname) 테이블에서 댓글 작성자가 해당 게시글을가진 닉네임이 존재하는지 확인한다. 존재하지 않을 경우 익명 닉네임(Community_Nickname) 테이블에 작성자의 ID와 게시글의 ID를 저장한다. 문제가 된 케이스는 조회할 떄 getNickname()을 사용한다. 익명의 게시글이 두개일 경우 single{ } 함수에 의해 IllegalArgumentExcepti..

article thumbnail
[JUnit] 공통 테스트 환경 구성
Java/Test 2023. 8. 15. 19:05

개요 테스트마다 필요로하는 어노테이션을 매번 작성해주는 경우 만약 변경사항이 있을 경우 매번 수정해주는 부분이 유연성이 떨어진다. 그래서, 특별한 이유가 있지 않은 이상 테스트 환경은 공통으로 구성하고 사용하는게 유지보수 측면에서 좋다. 커스텀 어노테이션을 구성해도 괜찮지만 만약 공통으로 @Autowired나 @Mockbean처럼 의존성을 주입하는 경우가 있는 경우 추상 클래스로 만드는 경우가 더 낫다. 통합테스트 밑과 같이 3개의 어노테이션이 통합테스트에 공통으로 쓴다면 @ActiveProfiles("test") @WithMockUser(username = "test", roles = "USER") @SpringBootTest 1. IntegrationTestSupport.class 라는 추상 클래스를..

article thumbnail
Mockito를 사용하여 외부 API Stubbing
Java/Test 2023. 8. 15. 18:07

Test Double이란? 객체를 mocking 하여 테스트 하는 방법들을 칭한다. 객체를 mocking해서 테스트하는 여러개의 방법들이 존재한다. 이 글은 외부 API를 stubbing해서 테스트하는 방법을 설명하는 글이여서 Test Dobule 에 관한 자세한 내용은 정리 잘되어있는 글의 링크(https://hudi.blog/test-double/)를 첨부한다. Stubbing 이란? Stub은 특정 메서드나 함수 호출에 대한 기대 동작을 갖춘 객체로, 특정 상황에서 함수 호출 시 미리 정의된 값을 반환하거나 미리 정의된 동작을 수행합니다. Stub은 주로 특정 함수의 행동을 테스트하기 위해 사용되며, 실제 로직은 포함하지 않을 수 있습니다. 예를 들어, 데이터베이스나 외부 서비스 호출을 대신하여 ..

article thumbnail
MockMvc로 API 슬라이스 테스트 하기
Java/Test 2023. 8. 9. 03:19

개념 알아보기 슬라이스 테스트란? 특정 계층 테스트를 말한다. @SpringBootTest를 사용하여 통합테스트를 하는것보다 슬라이스 테스트를 하면 더 작은 단위로 쪼개어 테스트하기 때문에 테스트 시간이 짧고, 관련 없는 빈들을 로드하지 않아 통합테스트보다 가볍고 빠른 테스트가 가능하다. @WebMvcTest: 웹 계층의 컨트롤러(Controller) 테스트를 위한 슬라이스 테스트입니다. @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, Filter, WebMvcConfigurer and HandlerMethodArgumentResolver 관련 bean들이 로드됩니다. @DataJpaTest: JPA관련 테스트를 위한..

article thumbnail
JUnit을 사용하여 예제로 TDD 맛보기
Java/Test 2023. 8. 2. 16:29

TDD(Test Driven Development)란? 테스트 중심적 개발이다. -> 테스트를 중심으로 개발하는 개발 방법론이다. 당연히 TDD는 설계 테스트 등 복잡하지만 이글에서는 간단하게 TDD관련된 메인 아이디어만 맛보기로 예시와 작성한 글이다. TDD 작성 단계 RED: 테스트를 먼저 작성한다. 구현이 없으므로 테스트는 실패 해야한다. GREEN: 테스트를 성공시키기 위해 최소 요구조건에 맞게 코드 품질 상관없이 구현한다. REFACTOR: 테스트 코드를 성공하면서 개선하고 리팩토링한다. Advantages: 협력 & 문서 -> 많은 개발자들이 협력해도 테스트 코드가 작성이 잘 되어있으면 파악이 쉬워 개발 생산성이 향상된다. 좋은 설계 -> 테스트 코드를 짜면서 코드를 분리하고 리팩토링 함으로써..

article thumbnail
[Kotlin] @PreAuthorize를 사용한 인가(Authorization)처리
Kotlin 2023. 4. 29. 11:28

Authorization이란? 인증(Authentication)받은 사용자가 가지고 있는 인가를 뜻한다. 인가는 유저가 가지고있는 권한(Role)을 확인해서 권한이 가지고있는 액션들만 행할 수 있다. 밑과 같이 예제를 들면 ADMIN/USER 권한이 있고 각 권한마다 할 수 있는 행동들이 정해져 있다. 인증된 유저가 권한이 해당되는 액션들만 할 수 있게 처리하는게 인가(Authorization)이다. Spring Security를 사용해 간단하게 구현해보자. ADMIN 권한: 회원 승인/ 회원차단 USER 권한: 회원가입 data class SimpleAuthentication( val user: User ) : Authentication { override fun getAuthorities(): Col..

article thumbnail
[DDD] 도메인 주도 개발 시작하기 CH_8. 애그리거트 트랜잭션 관리
책/도메인 주도 개발 2023. 4. 17. 05:02

위와 같이 한 애그리거트에서 두 사용자가 동시에 변경할 경우는 어떻게 해야할까? 주문 애그리거트에서 운영자와 고객이 동시에 수정하는 과정이다. 운영자는 배송 상태를 변경 고객은 배송지를 변경 위와 같은 경우에서 문제점은 운영자는 기존 배송지 정보를 이용해 배송 상태를 변경하고 그 사이에 고객은 배송지 정보를 변경했다. 이럴 경우에는 두 가지중 하나를 해야한다. 운영자가 배송지를 조회하고 상태를 변경하는동안, 고객이 애그리거트를 수정하지 못하게 제한 운영자가 배송지 정보를 조회한 이후에 고객이 수정하면, 운영자가 다시 조회한 후 배송상태 변경 결국에는 하나가 실행된 후에 다른 하나가 실행되야한다. DBMS가 지원하는 트랜잭션과 함꼐 애그리거트를 위한 트랜잭션 처리 기법을 사용해 처리해야한다. 대표적인 트랜..

article thumbnail
JWT(JSON WEB TOKEN) 이란?
DevOps&Network 2023. 4. 17. 04:26

개요 인증방식은 어떤 서비스를 하던 거의 쓰이며 중요하다. 보통 Cookie/Session/JWT 세가지 방식이 있는데 JWT를 보편적으로 실무에서 많이 사용한다. 위 세가지 방식에 대해 차이점과 왜 JWT가 보편적으로 많이 사용하는지 알아보자. Cookie / Session 차이점 Cookie 웹 브라우저에 저장되는 키-값 쌍의 작은 데이터 파일 서버에서 클라이언트에게 쿠키를 설정하도록 요청하고, 클라이언트는 쿠키를 저장하고 다음 요청에 함께 보내게 됨 클라이언트 측에서 쿠키를 관리하므로 서버에서는 쿠키를 조작할 수 없음 브라우저를 종료해도 쿠키는 보존될 수 있으며, 만료 기간을 설정할 수 있음 -> 단점: 클라이언트에서 관리하므로 보안이 약하다. 또한, 네트워크에 부담이 간다. Session 서버 ..

article thumbnail
[JAVA] 프로그래머스: 가까운 수

https://school.programmers.co.kr/learn/courses/30/lessons/120890 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr public int solution(int[] array, int n) { int answer = 0; Arrays.sort(array); for(int i = 1 ; i Math.abs(n-array[i])){ array[0] = array[i]; } } answer = array[0]; return ans..

article thumbnail
[JAVA] 프로그래머스: k의 개수

https://school.programmers.co.kr/learn/courses/30/lessons/120887 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr public int solution(int i, int j, int k) { int answer = 0; for(int a = i; a