본문 바로가기

마주쳤던 이슈 기록

(14)
#11. Docker - ERROR 1146 (42S02) at line 1: Table 'library_db.book' doesn't exist [에러] Docker에서 MySQL 컨테이너를 생성하며 기존 LibraryAPI에서 사용한 것과 마찬가지로 초기 데이터 .sql 을 데이터베이스에 기입하여 서버를 동작하려 했다. 하지만 초기 데이터.sql 을 Dockerfile 을 통해 MySQL 컨테이너의 기본 디렉토리에 복사했음에도 ERROR 1146 (42S02) at line 1: Table 'library_db.book' doesn't exist 에러, 즉 데이터의 테이블 부재 에러가 발생하여 MySQL 컨테이너가 실행되지 않았다. [원인] 기존 LibraryAPI 에서는 application.yml 에서 Spring Data JPA의 ddl-auto 기능을 사용했다. ddl-auto 기능은 @Entity 매핑된 엔티티 객체들을 자동으로 DB에..
#10. Docker - java.net.UnknownHostException: mysql Docker로 자바 애플리케이션, MySQL의 이미지를 생성했고, 각 이미지를 실행시켜 컨테이너를 생성. 하지만 자바 애플리케이션의 컨테이너 실행 시, MySQL의 컨테이너를 찾지 못해 컨테이너의 실행 X. [에러] 1. cj.exceptions.CJCommunicationsException: Communications link failure 2. java.net.UnknownHostException: mysql [원인] 만약 두개의 컨테이너를 docker-compose.yml 파일로 관리하게 되면, 컨테이너끼리 같은 네트워크에 속하여 통신할 수 있지만, 지금 처럼 MySQL 컨테이너, 자바 애플리케이션 각 각 별도로 컨테이너를 관리하게 되면 컨테이너 간에 네트워크가 다르게 속하게 된다. 즉, 네트워크가..
#9. Docker build - error from sender: context canceled [에러] 애플리케이션을 Docker의 이미지로 만들기 위해서는 Gitbash나 터미널을 통해 아래의 코드를 입력하여 build를 해야한다. docker build -t {이미지이름} . 하지만 아래와 같은 에러 로그가 발생되어 이미지화가 진행 되지 않았다. Stack Overflow에도 동일한 에러로 고통받는 개발자들이 많이 보였는데, 다들 빌드를 진행하는 프로그램의 문제 or 메모리 부족 등과 같은 나와는 다른 이유였다. [원인] 원인을 찾던 중, MySQL이 제대로 동작하지 않아서 라는 글이 보였다. 그래서 인텔리제이에서 애플리케이션을 실행하여 개발한 API에 요청을 보내 DB에 데이터를 확인했다. 결국 DB는 정상이었는데, 가만보니 Docker 빌드를 하는 애플리케이션이 실행중인 상태가 눈에 띄었다..
#8. JUnit - The following parts of the payload were not documented [에러] JUnit Test 하는 과정에서 문서 snippet으로 되는 내용 중 response에 포함된 필드를 설명하는 부분. responseFields( List.of( fieldWithPath("libraryId").type(JsonFieldType.NUMBER).description("소속 도서관 ID"), fieldWithPath("bookId").type(JsonFieldType.NUMBER).description("검색한 도서 ID"), fieldWithPath("libraryBookId").type(JsonFieldType.NUMBER).description("도서관에 보관중인 책 ID"), fieldWithPath("bookTitle").type(JsonFieldType.STRING).d..
#7. 로그인 이후 response Header에 JWT 미전달 [에러] JWT 적용하고 로그인 이후, response header를 통해 로그인 인증 유저에게 발행된 JWT Authorization이 전달되지 않아 서비스 이용이 불가능. [원인] 로그인 인증 성공 시 JWT를 생성하여 response 헤더로 JWT 토큰을 전달하는 메서드에서 토큰만 발행하고 응답의 Header 필드에 전달해주지 않았음. @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { Member member..
#6. 유저의 행동 횟수 조건 reset = Spring Data JPA 자동메서드 [에러] 현재 user가 특정 도서관에서 책을 대여하는데 최대 5권까지 대여가 가능한 조건을 걸어뒀다. int rentalHistoryCount = memberBookRepository.countByMember(targetMember); if (rentalHistoryCount >= 5) { throw new BusinessLogicException(ExceptionCode.MAXIMUM_RENTAL_ALREADY); } targetLibraryBook.setBookStatus(Book.BookStatus.UNAVAILABLE); libraryBookService.saveLibraryBook(targetLibraryBook); countByMember()메서드는 Spring Data JPA에서 제공하는 ..
#5 Mapper: Dto -> Entity 변환 시 Null 에러 사이드 프로젝트를 진행하던 중, 회원 가입 로직을 처리하던 중이었다. 내가 구현하는 회원 가입의 로직 순서는 다음과 같다. 1. Client 측으로부터 회원 가입을 위한 정보를 전달 받는다. 2. Server는 Client의 요청에 담긴 데이터를 DTO 객체로 받는다. 3. Mapper (Map Struct)를 활용하여 전달받은 DTO를 Entity 객체로 변경 후 DB에 저장. 4. DB에 저장 후 저장된 Entity객체를 response에 담기 위해 DTO 객체로 변경. 5. Response DTO 타입을 반환 [에러] application를 가동 후 Client 측에서 정보를 담아 Server측으로 전달하면, 전달받은 정보 중 password 필드가 null 이 되는 에러가 발생. 즉, Mapper..
#4. @Value 애너테이션 미인식 에러 Spring Boot에서는 개발을 진행할 때 OAuth2 ClientId, ClientSecret, RedirectUri, JwtSecret 등과 같이 개인 정보와 관련된 민감한 정보들은 application.yml에 특정 변수를 작성하고 실제 값들은 시스템-환경 변수 혹은 AWS-parameterStore 같은 웹 서비스에 담아 보관하며, 애플리케이션을 실행할 때, 내부 로직에 의해 환경 변수에 보관하는 실제 값들을 호출하여 사용한다. application.yml에 등록해둔 환경 변수의 이름들은 클래스 내부에서 필드로 생성하고 해당 필드에 @Value 애너테이션을 붙여서 application.yml 내의 경로를 입력하면 시스템-환경 변수 혹은 AWS ParameterStore 웹 서비스에 저장된 실제 ..