Programming

    Circular view path [error] 원인과 해결방법

    상황 운영 서버의 그라파나를 확인해보니 API 500 에러와 함께 아래 로그가 발생하고 있었다. javax.servlet.ServletException: Circular view path [error]: would dispatch back to the current handler URL [/error] again. Check your ViewResolver setup! 문제 원인 구글링을 해보니 에러가 발생한 원인은 크게 2가지로 나뉜다. @Controller 사용 시 @GetMapping으로 매핑된 url과 view의 이름이 같은 경우 클라이언트에서 잘못된 url을 요청했을 때 에러를 핸들링할 ErrorController를 만들어주지 않았을 경우 나같은 경우 2번에 해당했다. Nginx log를 보니 ..

    실무에서 JPQL 대신 Querydsl을 많이 사용하는 이유

    JPQL로도 모든 쿼리문을 작성할 수 있는데, Querydsl을 사용한 이유가 무엇인가요? 우테코 당시 크루들 사이에서 이런 질문이 나왔다. 답은 동적쿼리 때문이다. 하지만 나는 동적쿼리가 왜 필요한지 이해할 수 없었다. 그래서 프로젝트를 할 때에도 모든 쿼리를 JPQL로만 작성했다. public interface ReservationRepository extends JpaRepository { @Query("SELECT r FROM Reservation AS r " + "INNER JOIN r.crew AS c " + "ON c.id = :crewId " + "INNER JOIN r.schedule AS s " + "ORDER BY s.localDateTime DESC") List findAllByCr..

    DB 설계하는 법 (feat. 데이터 모델링)

    부제: 현업에서 DB 설계는 어떻게 진행할까? 서론 신입으로 처음 회사에 들어온 뒤 3주만에 DB 테이블을 한번 설계해보라는 업무를 맡았다. 우테코에서 토이프로젝트를 할 때도 테이블 설계를 빡세게 하지 않았던 터라 막막하기만 했다. 부랴부랴 실제 현업에서 사용하는 ERD를 검색해보지만 결과는 거의 나오지 않았다. 그야 당연한 것이 DB 테이블 구조는 회사 기밀이기에 기술블로그에 공개하지 않기 때문이다. 우선 급한대로 타사(네이버, 쿠팡)에 들어가 개발자도구를 열어 Response로 어떤 값들이 날라오는지 확인했다. 이를 토대로 필요한 값들을 담은 엔터티를 설계했다. 기획안을 보며 빠진 데이터는 엔터티에 컬럼을 추가해 보완했다. 결과물을 사수분께 설명하면서 난 그순간 크게 잘못됐음을 직감했다. 1)엔터티에..

    [Redis] 레디스 데이터 타입 정리

    이 포스팅은 레디스 공식 문서를 보고 지식을 정리하기 위해 쓴 글입니다. Strings Redis String 유형은 Redis 키와 연결할 수 있는 가장 간단한 유형의 값이다. Memcached에서의 유일한 데이터 타입이자, Redis에서도 자연스러운 값이다. 기본적으로 SET, GET을 이용해 문자열 값을 설정하고 검색할 수 있다. > set mykey somevalue OK > get mykey "somevalue" SET는 키가 문자열이 아닌 값과 연결되어 있더라도 키가 이미 존재하는 경우 키에 이미 저장된 기존 값을 대체한다. SET 명령에는 추가 인수로 제공되는 여러 옵션이 있다. 예를 들어, 키가 이미 존재하는 경우 실패하도록 요청하거나, 키가 이미 존재하는 경우에만 성공하도록 요청할 수 있..

    Lombok 정리

    @Getter와 @Setter, @RequiredArgsConstructor와 같이 기본적으로 사용하는 애노테이션에 대한 설명은 생략한다. @FieldDefaults Adds modifiers to each field in the type with this annotation. Complete documentation is found at the project lombok features page for @FieldDefaults. If makeFinal is true, then each (instance) field that is not annotated with @NonFinal will have the final modifier added. If level is set, then each (inst..

    프로그램과 프로세스, 스레드의 차이

    서론 면접 질문으로 프로그램과 프로세스, 스레드의 차이에 대해 설명해달라는 질문을 받았다. 이에 대해 온전히 답변하지 못했기에 다시 공부하는 마음가짐으로 이 글을 적는다. Q. 프로그램과 프로세스의 차이에 대해 말씀해주세요. A. 프로세스는 실행 중인 프로그램을 말합니다. 하드디스크에 저장되어 있는 프로그램이 실행되면 메모리에 적재되어 CPU의 자원을 할당받아 프로세스가 됩니다. 프로그램은 수동적인 존재, 프로세스는 프로그램을 실행하는 능동적인 존재로 비유할 수 있습니다. 프로세스가 실행되면 PCB(Process Control Block, 프로세스 제어 블록)가 생성됩니다. PCB는 운영체제가 프로세스를 제어하기 위한 정보들의 저장소입니다. PCB에는 실행될 다음 명령어 주소를 저장하는 프로그램 카운터를..

    JPA Entity의 equals와 hashCode

    문제가 발생한 코드 상황 코치의 스케쥴을 업데이트하는 로직에서 Entity의 equals와 hashCode를 재정의하지 않아 List의 contains 메서드가 항상 false인 문제가 발생했다. 요약 equals와 hashCode를 재정의하지 않으면 어떤 문제가 발생하는지 알아본다. 또한, JPA의 Entity에서 equals와 hashCode를 재정의하지 않으면 어떻게 동작하는지 알아본다. 원인 위 문제는 equals를 재정의하지 않아 생긴 문제였다. List 내의 Schedule들은 모두 비영속 상태이므로 JPA와 상관없이 순수 자바 로직 문제이다. contains 메서드는 내부적으로 .equals() 동등 비교를 진행한다. 내부 요소 중 인자로 받은 값과 .equals() 비교를 진행했을 때 tr..

    Optional

    서론 면접 질문으로 Optional에 대한 꼬리질문을 받았다. 옵셔널에 대한 소개와 이점 null을 그냥 반환하면 안되나요? 옵셔널 처리 방법? 옵셔널을 사용하면서 주의해야할 점은? 인텔리제이 옵셔널을 파라미터로 넣으면 경고가 뜨는데 왜그럴까? 꼬리 질문에 대해 제대로 답변하지 못했기에 Optional을 다시 공부하는 마음가짐으로 이 글을 작성하게 되었다. NullPointerException 피하기 NullPointerException는 골치 아픈 문제이다. 1965년 처음으로 null을 도입한 토니 호어(Tony Hoare)도 null을 만들었을 때를 회상하며, 이는 10억 달러짜리 실수라고 했다. null 때문에 발생할 수 있는 문제는 아래 예제를 통해 살펴보자. public class Person..