본문 바로가기

트러블슈팅

(57)
Mac, IntelliJ에서 JDK 관련 Maven 빌드 문제. JAVA_HOME, PATH 환경변수 설정 문제 Mac에서 IntelliJ에 메이븐 프로젝트를 빌드하려고 했는데, 아래와 같은 에러가 났다. 'No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?' 메이븐을 빌드할 때, JDK 대신 JRE를 사용하고 있는 거 아니냐고 묻는 에러였다. 메이븐은 빌드할 때 JDK를 사용한다. 참고로 Java를 설치할 때 JDK를 설치해야 한다. JRE는 JAVA 실행 환경만 제공하고, JDK가 실행환경 + 개발환경을 제공한다. 메이븐의 JDK 설정이 안되어 있는 거 같아, Command + ; 를 눌러 IntelliJ 환경 설정에 들어가서 임포터의 JDK를 Mac에 설치된 1.8 JDK로 설정해주었..
JPA에서 Join 테이블 전략으로, 상속 관계인 엔터티를 Insert 시, "Cannot insert explicit value for identity column in table '테이블명' when IDENTITY_INSERT is set to OFF." 문제 문제 ResourceEntity를 상속받은 FormEntity에 데이터를 입력하여 저장하려고 했더니, 아래와 같은 에러가 났다. annot insert explicit value for identity column in table 'TX_ZIMGO_FORM' when IDENTITY_INSERT is set to OFF. 문제 원인 ResourceEntity를 상속받은 다른 엔터티들 중 AccountEntity를 살펴보았다. TX_ZIMGO_ACCOUNT의 테이블의 ID 컬럼을 살펴보니, IDENTITY가 없었다. 반대로, 문제가 되었던 TX_ZIMGO_FORM의 ID 컬럼은 IDENTITY가 있었다. 문제 해결 TX_ZIMGO_FORM의 ID 컬럼의 IDENTITY 속성을 없애주고, 테이블을 다시 생성..
JPA로 엔터티의 테이블 CREATE 시, expected "identifier" 에러 문제 JPA의 ddl-auto 속성을 create로 두어, 스프링 부트 시작 시, 메모리 임베디드 DB인 H2 Database에 Entity의 테이블을 자동 생성하고자 했다. H2 Database의 SQL 문법을 MySQL로 설정하기 위하여, properties.hibernate.dialect를 org.hibernate.dialect.MySQL5InnoDBDialect 로 설정해주었다. 그런데, 부팅하려고 하니 DDL관련 아래와 같은 에러가 발생하였다. SQL Syntax 에러라서 확인을 위해 SQL 구문을 h2-console에서 실행켰다. 그럤더니 잘 실행된다. 검색에서는 expected "identifier" 를 찾아보니, 예약어를 사용하는 경우 발생한다고 한다. 하지만, 예약어가 될 만한 것도 없는..
iFrame에 서버로부터 받은 pdf 파일이 나오지 않는 문제 문제 pdf 파일을 클라이언트로 보내주는 API를 만들었다. 클라이언트에서는 iFrame의 src에 API의 url을 넣었으나, iFrame에 보이지 않는 문제가 있었다. 문제 원인 Postman에서 API를 호출 했을 때 파일이 잘 다운 받아지는 것을 알 수 있었다. 또한, URL을 브라우저에 직접 입력해보니 파일이 잘 다운로드 되어졌다. 파일 저장하고 다운 받는 것에는 문제가 없는 것을 확인했다. 그런데, 왜 iFrame은 다운받은 pdf 파일을 보여주지 못하는 걸까? 어떻게 하면 다운받지 않고, iFrame에 보여줄 수 있을 지 찾다가 아래 StackOverFlow 글을 발견하였다. https://stackoverflow.com/questions/6293893/how-do-i-force-files-..
엔터티의 양방향 관계와 Lombok의 @Data와 @toString으로 인한 StackOverFlow 문제 결론부터 말하자면, 엔터티에서 양방향 관계일 때, Lombok의 @Data와 @toString은 StackOverFlow 문제를 일으킬 수 있기 때문에 사용에 조심해야한다는 것이다. 문제 FareEntity라는 객체를 담은 List를 Map 형태의 Map으로 변경하고자 했다. 변경하는 부분에서 아래와 같이 StackOVerFlow 에러가 발생하였다. java.lang.StackOverflowError: null at java.base/java.lang.String.coder(String.java:3258) ~[na:na] at java.base/java.lang.String.getBytes(String.java:3191) ~[na:na] at java.base/java.lang.AbstractString..
JAVA SSL 인증서 문제 - PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException 문제 Postman에서는 문제 없이 호출되었던 URL이, 자바에서 FeignClient를 이용해 호출하려고 하니 아래와 같이 javax.net.ssl.SSLHandshakeException 등으로 인한 feign.RetryableException이 났다. SSL이 있어서 인증서 문제라고 생각했다. java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ... 생략 ... Caused by: feign.RetryableException: PKIX path building failed: sun.security.provider.certpath..
BooleanExpression의 NullPointException에러 BooleanExpression을 LeftJoin에 넣었더니 NullPointException 에러가 났다. BooleanExpression은 null일 시 알아서 조건에서 제외되는 줄 알았는데, leftjoin의 on이 아니라 where 절에만 해당되는 것이었다. BooleanExpression을 사용한 groupIdIn을 where 절로 변경함으로써 NullPointException 문제를 해결할 수 있었다.
Mac에서 올린 파일이 Window에서 다운 받을 때, 파일명의 자음 모음이 분리되는 현상 문제 아래 사진처럼 Mac에서 올린 파일을 Window에서 다운 받을 때, 파일명의 자음 모음이 분리되는 현상이 있었다. 원인 Window와 Mac이 서로 다른 유니코드 정규화 방식을 사용하기 때문이었다. Mac OS X 는 NFD, Window는 NFC 를 쓴다. NFD와 NFC의 차이점은 아래 블로그글 참조. https://www.hungrydiver.co.kr/bbs/detail/develop?id=68&scroll=comment 유니코드 정규화(Unicode Normalization Form) 문제 www.hungrydiver.co.kr 해결방안 Java에서 제공하는 java.text.Normalizer을 이용해 해결할 수 있다. 아래 코드로 파일 이름을 NFC로 normalize 해주면 된다. ..
Pod들이 143 Error로 계속 리부팅되는 문제 Legacy라는 서비스의 모든 Pod들이 동시에 143 Error로 모두 계속 죽고 다시 살고, 또 죽고 다시 사는 문제가 발생했다. 모든 Pod들이 죽었기 때문에 서비스가 중지되었다. 아래 캡처는 K9S를 이용해 Pod에 대한 Description을 캡처한 것이다. 원인 Hikari Connection Pool Pod에서 143 에러 코드가 무엇인지 찾아봤다. 143 에러코드는 Application에서 SIGTERM(종료 신호)를 Pod에 보냄으로써 바로 Pod를 종료시키는 것이 아니라, Graceful Shutdown으로 Pod를 종료시킨 것임을 알았다. GracefulShutDown이란 Pod가 종료 시그널을 받았을 때 처리 중인 Request가 있다면 모두 처리하고 Pod를 종료시키는 것을 의미한..
필드명으로 인해 Spring Request DTO 에 null 값이 들어가는 이유 문제 상황 Spring Request DTO의 파라미터로 아래와 같이 gTotal이라는 필드를 만들었다. import java.math.BigDecimal; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor public class TestDTO{ private DocsPackingGroupTotal gTotal; @Getter @Setter public static class DocsPackingGroupTotal{ private BigDecimal netWeight; private BigDecimal grossWeight; } } @RestControll..