![Java11의 CharSequence에서 isEmpty() 사용 시 컴파일 에러 발생](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBYrQa%2FbtsJnh5rANs%2FRb8aPpkb1W9L1VN6bs0bz1%2Fimg.png)
백준에서 자바11로 StringBuilder의 isEmpty()를 사용하다 컴파일 에러를 마주침 isEmpty()는 CharSequence 인터페이스의 메서드로, 자바 15 이상부터 지원한다. 따라서 자바11에서는 isEmpty()대신 length()를 사용해 길이가 0인지를 비교해야한다. 실제로 isEmpty 메서드도 length가 0인지를 확인하는 방식으로 구현된다.
![Amazon S3에 이미지 파일 업로드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFP7sc%2FbtsIKgy9vTt%2F05UPEGNcRGQNTkjjTrGlM0%2Fimg.png)
진행중인 프로젝트에서는 사진 저장이 필요하다. 이를 위해 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 에러 해결](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhhnun%2FbtsICTbLtPw%2FZFTc48f8epBAtvSv8SYXsK%2Fimg.png)
문제상황@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 수정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8N04o%2FbtsHTCJ9wuz%2FKF3SBHda0OhFGLKs7A3JA0%2Fimg.png)
왓슈 프로젝트를 진행하며 비즈니스 로직을 어디에 작성해야하는 지에 관해 고민을 많이 했었다. "가입 신청 취소" api에서는 일련의 과정을 거친 뒤 가입 신청 엔티티의 status를 canceled로 바꿔주어야 한다.이때 ClubJoinRequest 엔티티의 status 필드를 어디에서 바꿔줘야 할까?1. 외부(ex_service 레이어)에서 status 필드를 직접 변경한다.2. 엔티티 내에서 status 필드를 직접 변경한다. 관련해서 다른 블로그도 찾아본 뒤 엔티티 내에 비즈니스 로직을 위치시키자는 결론을 지었으나 왜 그래야하는 지에 대해 스스로에게 물었을 때 명확하게 답변을 할 수 없었다. 그러다 최근 조영호님의 객체지향의 사실과 오해를 읽고나서 깨달은 바가 있어 생각을 정리해보고자 한다. 객체지..
![@ParameterizedTest](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsdWBj%2FbtsHcsuLRFN%2FU2go3LWVcigANRJeHXJxq1%2Fimg.png)
문제상황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)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FszVYc%2FbtsHeft5wD5%2FmPdNKPHHRXKh49lM8kUPjK%2Fimg.png)
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)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGWi6n%2FbtsGZnty0jN%2FzkKK3XwAaEDy7NbbrXcjF0%2Fimg.png)
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)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F28c3S%2FbtsGS6EzHjU%2Fd723Y0qM314VKmLwwWTdNK%2Fimg.png)
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)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH8BcE%2FbtsGOvYzylt%2FldpXUubGpwml8eyRbgk2dk%2Fimg.png)
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)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEDlAP%2FbtsGMfJLeKf%2FwjEUZZQHHBpqDOv8yyeKQK%2Fimg.png)
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..