전체 글

    [JPA] native query 사용 시 enum을 변수로 하기 ( SpEL expression )

    🙂 Native Query 란? JPQL을 사용해서 쿼리 메소드를 사용하는 것이 아닌 MySQL과 비슷한 형식으로 쿼리를 만들어 적용할 수 있다. 그러나, JPQL에서는 표준 SQL의 대부분의 기능을 지원하지만, 지원하지 못하는 문법들도 존재한다. ( ex. sub query ) 이때 Native Query를 사용하면 JPQL에서 지원하지 못하는 문법들을 사용할 수 있다. 🙂 Native Query 를 사용하는 방법 //-- JPQL @Query(value="SELECT M from Member M" ) //-- Native Query @Query(value="SELECT * from Member m", nativeQuery= true ) 🙂 Native Query에서 @Param에 Enum을 넣는 방법..

    [JPA] JPA native query 사용시 dto mapping

    보통 조인을 많이 사용하게 될 상황이 생기면 JPA Native query를 사용한다. 이 때, 조인되어지는 테이블들의 column 값을 사용해야하는 상황에는 Entity에 맵핑을 시켜줄 수 없는 문제가 있다. 이럴 때에는 바로 원하는 변수가 있는 DTO에 맵핑을 시켜주어야 하는데,, 어떤 방법들이 있을까? 1. Entity에서의 `@SqlResultSetMapping` 사용 @Entity @NamedNativeQuery( name = "find_books', query = "SELECT " + " 생략.... ", resultSetMapping = "book_dto" ) @SqlResultSetMapping( name = "book_dto", classes = @ConstructorResult( tar..

    [F.Y.R] Jitter? ( Retry의 전략 )

    맡고 있는 프로젝트에서 다른 서버와 통신을 하는 코드를 보던 중, 통신을 하는 서버에서 동시성 이슈로 재시도를 원하는 에러코드가 내려왔고, 이에 잠깐의 sleep을 한 후에 재시도하는 것을 볼 수 있었다. Retry? MSA구조에서는 서로 다른 서버와 통신을 할 일이 많다. 그렇기 때문에 서로 다른 서버와 통신할 때 실패율을 줄이는 것이 중요하며, 호출 재시도를 하며 실패율을 줄일 수 있다. 보통 Sleep을 해주는 이유는 동시에 요청이 왔을 때, 바로 재시도를 하게 된다면 동시성 이슈에 있어서 성공률은 떨어지기 때문이다. 그래서 보통은 Exponential Backoff Algorithm ( 백오프 ) 를 사용해야하는 걸로 알고 있었다. 1번째 재시도 : 1초 -> 2번째 재시도 : 2초 -> 3번째 ..

    [Error] org.hibernate.LazyInitializationException: could not initialize proxy

    😀 원인 파악 코드를 열심히 작성해서 리뷰를 받고, 즐거운 마음으로 라이브 배포를 했다.. 그러나 몇 분이 지나지 않고 error alert이 나오기 시작했고,,, 정말 어처구니 없는 실수를 했다는 것을 깨달았다. 에러 내용은 JPA에서 나온 오류였다.. org.hibernate.LazyInitializationException: could not initialize proxy 위와 같은 오류가 생긴 원인을 파악하기 위해서 구현한 부분을 다시 보았고, Entity 객체를 DTO 객체로 변경하기 위해 BeanUtils copyProperties로 간편하게 하려고 했던 부분해서 문제가 있다는 것을 발견할 수 있었다.. (괜히 빠르게 하려다가..) BeanUtils copyProperties란? 스프링에서 제..

    주석..주석에 대한 개인적인 고찰

    항상, 주석을 달면 다음에 읽을 사람을 위해 자세히 달아 주면, ( 아! 다음 사람이 이 주석을 보면서 코드를 더 잘 이해하실 수 있겠지?)라고 생각하며 기분 좋은 마음으로 달아주었다.. 하지만 직접 실무를 다루게 되고, 다른 사람이 만들어 놓은 코드를 읽을 때면 주석이 무조건 좋은 것이 아니라는 것을 깨달을 수 있었다... 클린코드에서는 아래와 같이 좋은 주석과 나쁜 주석을 분류해놓았다. 😆 좋은 주석 법적인 주석 의도를 설명하는 주석 의미를 명료하게 밝히는 주석 결과를 경고하는 주석 TODO 주석 중요성을 강조하는 주석 😱 나쁜 주석 주절거리는 주석 같은 이야기를 중복하는 주석 오해할 여지가 있는 주석 의무적으로 다는 주석 있으나 마나 한 주석 무서운 잡음 함수나 변수로 표현할 수 있다면 주석 X 닫..

    [Error] Cause: java.lang.ExceptionInInitializerError

    매번 GIT으로 레포지토리를 클론하고 새 환경에서....! Project를 실행하거나 빌드할 때, "java.lang.ExceptionInInitializerError" 에러를 자주 만나곤 한다. 구글링을 해보니 거의 80%는 JUnit, Gradle 등 버전 문제라고 한다. Java 8로 동작하는지, Junit의 버전은 무엇인지 체크를 잘 하면 되고, 보통은 IDE에서 15로 설정된 JVM를 8/1.8 로 설정을 해주면 잘 실행된다. Intellij IDEA => Preferences -> build -> Gradle -> Gradle JVM 버전 잘 설정하자....!