![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..
![[whatssue] 스프링 인터셉터를 사용해 사용자 권한 체크하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzrQB1%2FbtsGFl2Qy7m%2FmfkjhC7tRfjSS52uvSkAxK%2Fimg.png)
문제 상황모임 관리 프로젝트의 모임 관련 api를 개발하다가 다음과 같은 문제를 직면했다.1. 매번 club이 존재하는지 체크해주어야한다.2. 매번 로그인 유저가 이 club의 멤버인지 체크해주어야 한다.3. 매번 로그인 유저가 이 club의 관리자인지 체크해주어야 한다. (관리자 api인 경우)4. 매번 로그인 유저가 이 club에 가입 이후 처음 방문했는지 체크해주어야 한다. 클럽에 관련된 api마다 1, 2, 3, 4의 중복 코드가 발생한다. 해결방안중복되는 공통 관심사를 한번에 처리하고자 하였다.조금 찾아보니 필터, 스프링 인터셉터, AOP 로 공통관심사를 처리할 수 있었고,나는 스프링 인터셉터(Spring Interceptor)를 사용하여 이번 문제를 해결하고자 하였다. 스프링 인터셉터란 ?스..
![.properties 파일 인코딩 문제 해결](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ5Qq4%2Fbtso8zkDTda%2FJCxM1onzp9zZ2FNVg15us0%2Fimg.png)
스프링의 메시지 소스와 국제화 기능에 대해 학습하던 중다음과 같은 문제가 발생했다. locale 정보를 주지 않았기 때문에 디폴트 값인 messages_ko.properties를 우선 조회할 것이고,해당 파일또한 존재하지 않기 때문에 messages.properties를 조회할 것이다. 다음과 같이 테스트 실패. 테스트 실패와 함께 messages.properties의 한국어가 ??로 바뀌어있는 것을 확인했다. 우선 아래와 같이 영어로 바꾸어보았더니 정상적으로 테스트가 성공하는 것을 확인하였다. 확실하게 인코딩 문제임을 확신했고 인텔리제이 settings에서 encoding 관련 설정을 찾아보았다. Properties Files의 인코딩 설정 .properties 파일의 인코딩 설정을 UTF-8로 변경..
![[Java] Map의 value 값들을 리스트로 반환받기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXspH%2Fbtr3S0byhIR%2FHvv9eljn2rDIqzZjMkCcWk%2Fimg.png)
♪ 학습 내용 Map.values() / Collection vs List / stream.collect() 토이 프로젝트 중 Repository인 Map에서 List 형태로 값을 받아와야 하는 경우가 생겼었다. * Map의 value들을 반환 기본적으로 Map의 value 를 꺼내려면 key 값을 이용해서 꺼낼 수 있다. import java.util.HashMap; import java.util.Map; Map map = new HashMap(); map.get(key); 하지만 이렇게 하면 하나씩 밖에 꺼내지 못한다. 따라서 모든 value값 ( key 값도 가능)을 얻기 위해 map.values() import java.util.HashMap; import java.util.Map; Map map..
![[Spring] Spring 프로젝트 생성 및 설정](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMGCl%2Fbtr3gO99Y71%2FRaJQmlm5dlZrJva7II7BT1%2Fimg.png)
♪ 학습 내용 Spring Initializr 를 이용한 프로젝트 생성 및 설정 Spring Initializr 를 이용해 몇초만에 새로운 Spring 프로젝트를 생성할 수 있다. https://start.spring.io/ Gradle - Groovy 선택 Java 선택 SNAPSHOT 등 영어 붙은 버전 말고 가장 최신 버전 선택 (3.0.4) Group : 기업명 / 자유롭게 작성 artifact == name : 빌드결과물 이름 Dependencies 에 사용할 라이브러리를 추가해주었다. GENERATE 클릭 / 압축 풀기 스프링 부트 3.0 이후부터는 자바 17이 필수이기 때문에 이런 에러 발생하는 것.
![[Spring MVC 1] 스프링 MVC 웹 페이지 만들기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC787e%2FbtrZLUTeV4s%2FAPrXntCppvn1Xk0K5ig6Y1%2Fimg.png)
♪ 학습 내용 Spring MVC 기반 웹 페이지 만들기 (완) HTML/CSS/JS 프레임워크인 부트스트랩 사용하기 위해 부트스트램 파일 설치. spring 프로젝트 생성 시 뷰 템플릿인 타임리프 / 롬복 포함시키기. * 전체적인 흐름 * 시작 상품 도메인 모델 Item ( ID / 이름 / 가격 / 수량) @Repository 애노테이션 내부에는 @Component 가 포함되어 있어 컴포넌트 스캔 대상이 된다. 상품 저장소 로직 테스트 완료 롬복--> @RequiredArgsContructor 애노테이션 --> final 붙은 멤버변수를 사용해 생성자 생성 생성자 하나 있을 때 의존관계 생성자 주입은 @AutoWired 생략가능 따라서 컨트롤러는 ItemRepository를 생성자 주입 받고 있다. ..