인기글
[whatssue] 스프링 인터셉터를 사용해 사용자 권한 체크하기
[whatssue] 스프링 인터셉터를 사용해 사용자 권한 체크하기
Spring
2024.04.01 23:10
문제 상황모임 관리 프로젝트의 모임 관련 api를 개발하다가 다음과 같은 문제를 직면했다.1. 매번 club이 존재하는지 체크해주어야한다.2. 매번 로그인 유저가 이 club의 멤버인지 체크해주어야 한다.3. 매번 로그인 유저가 이 club의 관리자인지 체크해주어야 한다. (관리자 api인 경우)4. 매번 로그인 유저가 이 club에 가입 이후 처음 방문했는지 체크해주어야 한다. 클럽에 관련된 api마다 1, 2, 3, 4의 중복 코드가 발생한다. 해결방안중복되는 공통 관심사를 한번에 처리하고자 하였다.조금 찾아보니 필터, 스프링 인터셉터, AOP 로 공통관심사를 처리할 수 있었고,나는 스프링 인터셉터(Spring Interceptor)를 사용하여 이번 문제를 해결하고자 하였다.  스프링 인터셉터란 ?스..
.properties 파일 인코딩 문제 해결
.properties 파일 인코딩 문제 해결
Spring
2023.07.28 00:46
스프링의 메시지 소스와 국제화 기능에 대해 학습하던 중다음과 같은 문제가 발생했다. locale 정보를 주지 않았기 때문에 디폴트 값인 messages_ko.properties를 우선 조회할 것이고,해당 파일또한 존재하지 않기 때문에 messages.properties를 조회할 것이다. 다음과 같이 테스트 실패. 테스트 실패와 함께 messages.properties의 한국어가 ??로 바뀌어있는 것을 확인했다. 우선 아래와 같이 영어로 바꾸어보았더니 정상적으로 테스트가 성공하는 것을 확인하였다. 확실하게 인코딩 문제임을 확신했고 인텔리제이 settings에서 encoding 관련 설정을 찾아보았다. Properties Files의 인코딩 설정  .properties 파일의 인코딩 설정을 UTF-8로 변경..
최신 Dev 글
Java11의 CharSequence에서 isEmpty() 사용 시 컴파일 에러 발생
Dev2024.09.02 13:18Java11의 CharSequence에서 isEmpty() 사용 시 컴파일 에러 발생

백준에서 자바11로 StringBuilder의 isEmpty()를 사용하다 컴파일 에러를 마주침 isEmpty()는 CharSequence 인터페이스의 메서드로, 자바 15 이상부터 지원한다. 따라서 자바11에서는 isEmpty()대신 length()를 사용해 길이가 0인지를 비교해야한다. 실제로 isEmpty 메서드도 length가 0인지를 확인하는 방식으로 구현된다.

Amazon S3에 이미지 파일 업로드
Dev2024.07.24 00:10Amazon S3에 이미지 파일 업로드

진행중인 프로젝트에서는 사진 저장이 필요하다. 이를 위해 amazon s3를 사용하기로 했다. 우선 프로젝트에서 사용할 AWS 계정이 없어 생성했다.1. AWS에 프로젝트를 관리할 root 계정 만들기2. 실질적으로 사용할 모든 권한을 가진 admin IAM 생성 이후 S3 관련 IAM을 생성하고 spring 프로젝트와 연동을 해주었다.1. S3에 관해 모든 권한을 가진 s3 IAM 생성2. 1에서 생성한 IAM의 access key와 secret key를 발급3. gradle에 aws s3 의존성 추가4. 아래 사진과 같이 S3를 연동  위 S3Config에서 등록한 AmazonS3Client 빈을 가지고 버킷의 파일을 관리한다. amazon s3를 사용해 파일을 업로드 하는 방식에는 다음과 같이 3가..

JPA metamodel must not be empty 에러 해결
Dev2024.07.16 17:59JPA metamodel must not be empty 에러 해결

문제상황@WebMvcTest Controller 단위테스트를 마친뒤, Jpa Auditing 기능을 사용하기 위해 StockMateApplication에 @EnableJpaAuditing 애너테이션을 추가하자 기존에 성공하던 테스트들에서 다음과 같은 에러가 발생했다.   에러 메세지를 보아하니 jpaMappingContext 빈이 없어 발생하는 문제같다. 시도한 점@WebMvcTest는 컨트롤러 레이어를 테스트하는데에 특화되어있어 Controller, RestController, Resolver 등 Spring MVC와 관련된 빈들만 자동으로 등록한다.  Testing Spring Boot Applications :: Spring BootTo test whether Spring MVC controller..

비즈니스 로직을 어디에 위치시킬 것인가? 2024.8.10 수정
Dev2024.06.11 01:30비즈니스 로직을 어디에 위치시킬 것인가? 2024.8.10 수정

왓슈 프로젝트를 진행하며 비즈니스 로직을 어디에 작성해야하는 지에 관해 고민을 많이 했었다. "가입 신청 취소" api에서는 일련의 과정을 거친 뒤 가입 신청 엔티티의 status를 canceled로 바꿔주어야 한다.이때 ClubJoinRequest 엔티티의 status 필드를 어디에서 바꿔줘야 할까?1. 외부(ex_service 레이어)에서 status 필드를 직접 변경한다.2. 엔티티 내에서 status 필드를 직접 변경한다. 관련해서 다른 블로그도 찾아본 뒤 엔티티 내에 비즈니스 로직을 위치시키자는 결론을 지었으나 왜 그래야하는 지에 대해 스스로에게 물었을 때 명확하게 답변을 할 수 없었다. 그러다 최근 조영호님의 객체지향의 사실과 오해를 읽고나서 깨달은 바가 있어 생각을 정리해보고자 한다. 객체지..

@ParameterizedTest
Java2024.05.07 15:21@ParameterizedTest

문제상황JUnit을 활용하여 String 메서드의 단위 테스트를 진행하던 중 여러 값을 테스트하려니다음과 같이 중복 코드가 발생한다.private Set numbers;@Testvoid contains() { assertThat(numbers.contains(1)).isTrue(); assertThat(numbers.contains(2)).isTrue(); assertThat(numbers.contains(3)).isTrue();} 해결방안JUnit의 @ParameterizedTest를 사용하면 아래와 같이 중복 코드를 해결할 수 있다.@ParameterizedTest@ValueSource(ints = {1, 2, 3})void contains_with_parameterizedTest_V..

백준_2098 외판워 순회 (DP - TPS)
Algorithm 문제2024.05.07 00:04백준_2098 외판워 순회 (DP - TPS)

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class BJ_2098_외판원순회 { static int n; static int[][] w; static int[][] d; static int INF = 16*1000000 + 1; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ..

백준_11049 행렬 곱셈 순서 (DP)
Algorithm 문제2024.04.28 21:52백준_11049 행렬 곱셈 순서 (DP)

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class BJ_11049_행렬곱셈순서 { static int[][] matrix; static long[][] d; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); ..

백준_2342 Dance Dance Revolution (DP)
Algorithm 문제2024.04.23 22:55백준_2342 Dance Dance Revolution (DP)

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class BJ_2342_DanceDanceRevolution { static int MAX = 10000000; public static void main(String[] args) throws IOException { int[][] m = {{1, 2, 2, 2, 2}, {0, 1, 3, 4, 3}, {0, 3, 1, 3, 4}, ..

알고리즘
백준_2098 외판워 순회 (DP - TPS)
백준_2098 외판워 순회 (DP - TPS)
Algorithm 문제
2024.05.07 00:04
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class BJ_2098_외판원순회 { static int n; static int[][] w; static int[][] d; static int INF = 16*1000000 + 1; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ..
백준_11049 행렬 곱셈 순서 (DP)
백준_11049 행렬 곱셈 순서 (DP)
Algorithm 문제
2024.04.28 21:52
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class BJ_11049_행렬곱셈순서 { static int[][] matrix; static long[][] d; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); ..
백준_2342 Dance Dance Revolution (DP)
백준_2342 Dance Dance Revolution (DP)
Algorithm 문제
2024.04.23 22:55
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class BJ_2342_DanceDanceRevolution { static int MAX = 10000000; public static void main(String[] args) throws IOException { int[][] m = {{1, 2, 2, 2, 2}, {0, 1, 3, 4, 3}, {0, 3, 1, 3, 4}, ..
백준_1328 고층 빌딩 (DP)
백준_1328 고층 빌딩 (DP)
Algorithm 문제
2024.04.21 21:01
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BJ_1328_고층빌딩 { static long MOD = 1000000007; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int n = Integer.p..
백준_1915 가장 큰 정사각형 (DP)
백준_1915 가장 큰 정사각형 (DP)
Algorithm 문제
2024.04.21 00:37
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BJ_1915_가장큰정사각형 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int n = Integer.parseInt(st.nextToken()); in..
백준_9252 LCS 2 (DP)
백준_9252 LCS 2 (DP)
Algorithm 문제
2024.04.21 00:36
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class BJ_9252_LCS2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s1 = br.readLine(); String s2 = br.readLine(); int[][] d = new int[s1.length() + 1][s2.length() + 1]; int i, j; for (i = 1; i < s1.lengt..
백준_13398 연속합 2 (DP)
백준_13398 연속합 2 (DP)
Algorithm 문제
2024.04.18 01:50
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BJ_13398_연속합2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[] a = new int[n]; int[] l = new int[n]; int[] r = new int[n]; i..
백준_10844 쉬운 계단 수 (DP)
백준_10844 쉬운 계단 수 (DP)
Algorithm 문제
2024.04.16 22:42
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class BJ_10844_쉬운계단수 { static long M = 1000000000; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); long[][] d = new long[n+1][10]; int i, j; for (i=1; i
image