전체 글

전체 글

    package-info.java란

    서론 팀 내 코드리뷰를 하다 패키지에 package-info.java 파일이 존재한다는 사실을 알게 되었습니다. package-info.java가 무엇인지 잘 몰랐기에 이번 기회에 알아보고자 합니다. package-info.java란 package-info는 모든 Java 패키지에 추가할 수 있는 Java 파일입니다. package-info.java 파일은 2가지 목적으로 사용됩니다. 패키지 단위의 문서 작성 패키지 단위의 애노테이션 적용 1) 패키지 단위의 문서 작성 JDK5 이전에는 package.html을 통해 패키지 단위의 Javadoc 코멘트를 body 태그 안에 작성했습니다. 그러나 JDK5 이후에는 package-info.java가 등장해 package.html의 역할을 대신하기 시작했습니다..

    Redis를 캐시 저장소로 사용할 때 고려할 점

    상황 팀 내에서 캐시 저장소로 레디스를 고려하고 있어, RedisCacheManager를 세팅하는 업무를 맡았습니다. 작년에 우테코 팀 프로젝트를 진행하면서 Refresh token을 레디스에 넣어 사용했던 적은 있었으나, 실무에서 레디스를 운영해 본 경험은 없었습니다. 따라서 토이 프로젝트 환경이 아닌 실무에서 레디스 환경을 구축하면서 고민했던 점을 이야기해 보고자 합니다. 로컬 캐시 vs 글로벌 캐시 글로벌 캐시를 도입하기 전에 로컬 캐시와 글로벌 캐시의 차이점에 대해 명확히 할 필요가 있습니다. 로컬 캐시는 서버의 인메모리에 저장하는 캐시로 외부 저장소를 이용하지 않기 때문에 빠르다는 장점이 있습니다. 그러나 서버마다 각기 다른 캐시를 저장하기 때문에 변경 사항이 생길 경우 동기화가 즉시 이루어지지..

    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)엔터티에..

    취업 후 6주간의 회고

    우아한형제들에 입사한 뒤 6주가 지났다. 그동안 내가 어떤 점을 잘했고, 어떤 점이 후회되는 지 글로 적어보려 한다. 잘한점 후회되는 점 - 일을 진행할 때 자주 피드백을 받으려고 노력했다. - 내가 현재 무엇을 하고 있는지 팀원들에게 자주 공유하려고 노력했다. - 오너십을 갖고 프로덕트를 만드려 했지만 실제로는 그러지 못했던 것 같다. - 부족한 부분을 무리하게 공부하느라 번아웃이 찾아왔다. 잘한점 1) 일을 진행할 때 자주 피드백을 받으려고 노력했다. 예를 들어 이번주 금요일이 마감기한이라면, 아무리 늦어도 수요일 퇴근 전에 1차 보고를 통해 싱크업을 진행했다. 피드백을 자주 받으면서 내가 부족한 부분을 빠르게 보완하고 더 나은 결과물을 낼 수 있었다고 생각한다. 2) 현재 무엇을 하고 있는지 팀원들..

    글또 8기 다짐글

    얼마 전 글또 8기를 시작했다. 원래 나는 에너지를 밖으로 잘 쓰지 않는 성격이라 모임에 거의 참여하지 않는 편이다. 그러나 사람과 사람 사이에 긍정적인 에너지를 주고받는 게 얼마나 중요한지 알고 있다. 그래서 이번에 취업하고 나면 글또에 꼭 참여해야지 계속 생각하다 드디어 글또에 참여하게 되었다. OT 때 성윤님께서 신규 참여자일 경우 다음 3가지 질문을 고민해보라고 말씀해주셨다. 글또가 끝난 6개월 후에 어떤 모습이길 바라나요? 그 모습을 달성하기 위해 무엇을 해야 할까요? 그걸 꾸준히 할 수 있는 방법은 무엇일까요? 이 질문들에 대한 답을 하는 형식으로 다짐 글을 써본다. 글또가 끝난 6개월 후에 어떤 모습이길 바라나요? 6개월 후에도 지금처럼 개발을 좋아하고 개발 이야기를 할 때 눈이 반짝거리는 ..

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

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