Spring
11 posts
Querydsl만의 아늑한 🏡 지어주기

🧶 문제상황 🪐 비대해진 서비스 코드 줍줍은 요청에 따라 동적으로 변화해야 하는 복잡한 조회 조건을 걸기 위해 을 도입했다. 예전에 공부하며 가볍게 사용해 본 적은 있지만, 줍줍 요구사항만큼 복잡한 코드를 짜 본 적은 없었다. 에 코드를 넣는 식으로 우선 구현했고, 무사히 배포되었다. 그러다 을 쓰지 않는 다른 서비스 클래스 코드를 보니 ‘어… 여기는 너무 깔끔한데?‘하는 위화감이 들었다. 그리고 다시 을 쓰는 코드를 보니, 가 할 일이 에서 이뤄지고 있다는 생각이 들었다. 위에 있는 기존 의 짧은 예시 코드 내에서도 사용으로 인한 서비스 역할 비대화가 보인다. 의 경우 DB에서 데이터를 가져오는 역할을 완벽히 에 맡기고 있다. 반면, 는 DB에서 어떤 데이터를 가져올지 서비스 코드 상에 완전히 노출되어 있음을 볼 수 있다. 그래서 각 레이어 별 역할이 원칙대로 분리되도록 코드를 별도의 객체로 빼내는 리팩토링을 시작했다. ✂️ 일단 레포지토리 코드 분리 사용 예시를 보면 을…

October 26, 2022
Spring
트러블슈팅
etc
[JPA] EnableJpaAuditing의 내부와 CI의 소중함

💣 문제상황 줍줍에는 북마크 설정한 메시지를 모아서 보는 기능이 있다. 기존에는 이 북마크 목록을 보여줄 때, 북마크가 등록 된 메시지의 생성 시간 순서대로 보여줬다. 그러다 사용자 편의를 위해 이를 북마크 등록 시간 순서대로 보여주기로 바꿨다. 이 때, 북마크 등록 시간을 편하게 관리하기 위해 을 도입했다. 그리고 해당 PR은 순조롭게 머지 되었는데… 팀원 봄이 진행한 컨트롤러 테스트를 WebMvcTest로 개선하는 PR에서 문제가 생겼다. 봄의 로컬에서 테스트가 잘 돌아가는 상태였는데, PR의 github action에서는 테스트가 실패했다. 로 변경한 모든 용 컨트롤러 테스트가 같은 이유로 실패하고 있었다. 라는 문구가 눈에 띈다. 해당 문구로 라이브러리를 검색해보면 라는 클래스가 나온다. 사실 이 문구로 검색하면 많은 사람들이 해결법을 이미 올려두었다. 그런데 여기까지 오니, 이 대체 뭔데? 도 아니고 라고? 이거랑 은 무슨 상관이지? 등등 궁금한 점이 생겨서 코드를 조금…

October 14, 2022
Spring
JPA
트러블슈팅
메시지 조회 테스트 개선기

🛠 메시지 조회 테스트 개선기 초난감 메시지 조회 줍줍은 슬랙 메시지를 날짜이동, 윗방향 스크롤, 아래방향 스크롤, 단어검색, 특정 채널만 보기 등 여러 조건으로 조회할 수 있다. 사용자 편의를 위해 이렇게 다양한 조회 조건을 지원하다 보니 동적 쿼리 생성이 필요해 도 도입했다. 작성된 조회 코드와 테스트 작성을 위해 파악된 케이스만 봐도 복잡도가 짐작 갈 것이다. 어떤 점을 개선하고 싶었나 해당 메시지 조회 기능 개발은 다른 팀원들이 맡았다. 그래서 올라온 PR을 봤는데, 동작은 잘 했으나 코드 개발에 참여하지 않은 입장에서 테스트가 알아보기 어려웠다. 처음 테스트를 읽었을 때 왜 읽기 어렵다고 느껴졌을까? 먼저 데이터가 문으로 들어가는 게 원인 중 하나였다. 메시지 조회를 하려면 미리 저장된 1.멤버(사용자) 2.채널 3.채널 구독 데이터가 필수로 필요했다. 기본적으로 메시지에 의존관계가 있고, 조회 시 구독하는 채널 메시지만 필터링 하는 분기가 기본으로 있었기 때문이다.…

September 28, 2022
Spring
트러블슈팅
✨🌈💫테스트💫🌈✨ (토비의 스프링)

해당 포스팅은 토비의 스프링 3.1을 읽고 책 내용과 실습 코드 정리 및 스터디에서 나온 의견을 정리한 포스팅이다. 2장 테스트 스프링을 국비학원에서 처음 배운 나는 가 존재하는 줄도 몰랐다. 자잘한 코드 하나 고치는 데도 대소동이 일어났다. 회원가입 기능을 만드는데 비밀번호 제한이 잘 안되는 것 같다면 애플리케이션을 종료한다 코드를 수정하고 break point를 걸거나 출력문을 써둔다 다시 애플리케이션을 킨다 크롬 시크릿 + 강력 새로고침으로 페이지에 들어간다 회원가입을 시도하고 다시 확인한다 이런 과정을 거쳐야 했다. 테스트가 일상이 된 지금은 테스트가 없으면 불안하다. (레벨4 미션을 하면서 소홀해지긴 했지만…) 테스트를 배운 처음엔 신기했고, 그 다음엔 조금 귀찮았는데, 지금은 테스트가 없으면 줄 없이 번지점프하는 기분이 든다. 테스트는 나에게 자유롭고 재밌게 코드를 갖고 놀게 해주는 안전장치인 셈이다. 초난감 UserDaoTest 개선기 1장에서 만들었던 는 내가 예전…

September 18, 2022
Spring
오브젝트와 의존관계 (토비의 스프링)

해당 포스팅은 토비의 스프링 3.1을 읽고 책 내용과 실습 코드 정리 및 스터디에서 나온 의견을 정리한 포스팅이다. 1장 오브젝트와 의존관계 늘 만 생각했기에, 1장 서두의 가 중점인 스프링의 핵심 철학이 인상깊었다. 그래서 포스팅을 인용으로 시작한다. 자바 엔터프라이즈 기술의 혼란 속에서 잃어버렸던 객체지향 기술의 진정한 가치를 회복시키고, 그로부터 객체지향 프로그래밍이 제공하는 폭넓은 혜택을 누릴 수 있도록 기본으로 돌아가자는 것이 바로 스프링의 핵심 철학이다. 그래서 스프링이 가장 관심을 많이 두는 대상은 오브젝트다. p.53 초난감 DAO 개선기 JDBC API를 처음 배우며 만들었던 모습의 클래스를 만들었다. 제일 기본적인 기능으로 User 정보를 단건 저장하는 , 단건 조회하는 이 있다. 비록 동작은 잘 하지만 썩 잘 짠 코드 같진 않다. 어느 부분이 문제일까? 책에서는 세 가지 관심사가 섞여있는 것이 문제라고 한다. DB 연결 커넥션 가져오기 SQL 문장을 담은 St…

September 11, 2022
Spring
[Spring] 모든 요구사항을 한 엔드포인트로 처리해보자! 😂

해당 포스팅은 줍줍 개발 과정 중 맞딱뜨린 문제점과 답을 찾아가는 과정을 다른 방식으로 재구성한 글이다. 생각보다 글이 길어진 고로, 문제상황과 해결방안만 보고싶다면 문제상황 빈 컬렉션 주입을 이용한 해결 예시코드 이 둘을 보기를 권한다. 간단한 게시판 서비스를 상상하기 회원 가입과 탈퇴 당신은 지나가던 고양이의 의뢰로 서버를 개발하게 되었다. 고양이는 🐱 닉네임을 입력하면 가입이 가능하고, 탈퇴할 수 있는 서비스를 만들어 주세요 💬 라고 요구했다. 그래서 나는 (그리고 이 글을 볼 대부분의 사람들은) 이건 쉽지~ 하고 간단한 컨트롤러를 만들었다. 그런데 이제 엔드포인트를 하나로 하고 이 코드를 본 고양이가 말했다. 🐱 엔드포인트를 하나로 통일할래요. 그리고 이게 회원 가입인지 탈퇴인지는 body안에 쓸게요. 이렇게요. 💬 코드가 이상해지기 시작한다. 그래도 아직 납득 가능한 수준이다. 여기에 포스팅 기능도 몽땅 넣어줘 이 코드를 본 고양이가 또 요구했다. 🐱 각자 게시글을 쓰고,…

August 27, 2022
Spring
트러블슈팅
[Spring] @PostConstruct를 막아라

문제상황 서비스 배경지식 첫번째 참고 현재 개발중인 줍줍은 슬랙 무료 워크스페이스의 사라지는 메세지들을 대신 저장하고 보여주는 서비스다. 메세지 저장을 위해 최초 어플리케이션 구동 시, 해당 워크스페이스에 속한 모든 회원 정보를 가져온다. 이 역할을 라는 클래스의 안에 작성했다. 이유는 아래와 같았다. 어플리케이션이 구동하는 동안 발생하는 신규 가입, 탈퇴 이벤트는 실시간 반영이 된다 하지만 어플리케이션 최초 구동 전, 또는 업데이트 배포로 어플리케이션이 중지된 사이에 발생한 이벤트는 반영이 안된다 따라서 재구동 시 한 번 슬랙 API를 호출하여, 유저 정보를 업데이트한다 유저 정보를 메시지에서 참조하고 있어서 저장이 선행되어야 했다. 또, 로그인 시 이 정보와 슬랙 로그인으로 받은 정보를 대조해서 자체 토큰을 발급하는 까닭도 있다. 두번째 참고 슬랙은 라는 이름으로 슬랙 API에 HTTP 요청을 보내고 응답을 받는 객체를 제공한다. 그래서 슬랙 API 호출이 필요한 곳에서…

August 23, 2022
Spring
트러블슈팅
야생에서 사과씨 심기 (@Bean)

야생 학습을 하면 자연스레 지식이 실전을 뒤따르게 된다. 우테코에서 처음 제대로 경험한 야생 학습은 낯설었으나 너무 잘 적응한 탓인지 어느 순간 당장 쓰이지 않을 지식을 공부하는 게 마땅찮았다. 당장 터지는 테스트를 고치고 싶을 뿐인데 왜 을 알아야 하지? 이걸 쓸 때가 있을까? 좋게 말하면 야생, 나쁘게 말하면 땜빵 마인드로, 그래도 연계되는 지식을 우겨넣고는 있었다. 언젠가는 쓸모가 있겠지 하고. 이런 알지만 알지 못하는 죽은 지식이 레벨3 프로젝트를 하다 죽은 줄 알았지만 다 때가 있구나! 로 바뀌는 순간을 겪었다. @Bean은 외부 라이브러리를 등록하고… 나에겐 이 알지만 알지 못하는 죽은 지식이었다. @Bean과 @Component의 차이 포스팅을 쓰기도 했고, 의 쓰임새가 뭐냐고 하면 줄줄 얘기할 수 있었다. 개발자가 직접 제어할 수 없는 외부 라이브러리 클래스를 빈에 등록할 때 사용됩니다. 하고. 그런데 좀처럼 을 사용할 일이 없었다. 그러다 레벨3 프로젝트인 줍줍…

August 02, 2022
Spring
회고
우아한테크코스
세션의 정체를 찾아서(with 🍪, 🪙)

🔍 세션의 정체를 찾아서 세션의 정의 영어에서 이란 특정 활동이 수행된 기간을 의미한다. 일상 속에서 보자면 나는 꾸준히 PT를 받고 있는데, PT 수업 한 회를 세션이라고 불렀다. 그럼 CS의 세션은 무엇일까? ****을 의미한다. 통신을 하는 동안 세션이 유지된다면 세션의 정보를 이용할 수 있을 것이다. 이런 상태를 이라 부른다. 반대는 라고 부르는데, HTTP 프로토콜이 이에 속한다. (막간 홍보 : HTTP에 관심이 있다면 HTTP 테코톡) HTTP 프로토콜이 이기에, 여러 불편한 상황이 일어난다. 쇼핑몰에서 상품을 장바구니에 담을 때 마다 로그인을 새로 요구한다고 생각해보자. 짜증나서 사려던 것도 안 사고 나가지 않을까? 이런 무상태를 보충하기 위해 상태 유지를 돕는 기술을 함께 사용한다. 그 중 하나가 이다. javax servelet HttpSession 자바 서블릿의 은 인터페이스다. 이 포스팅에서 다룰 내용을 java docs에서 간추려보았다. 유저 정보를 저장함으…

July 09, 2022
Spring
CS
[Spring] @JdbcTest, @WebMvcTest, @SpringBootTest

DB를 연동하고 스프링을 쓰기 시작하면서 어플리케이션의 구조가 복잡해졌다. 그에 따라 테스트도 다양한 어노테이션을 활용하여 작성해야 했는데, 처음에는 예제를 보며 따라했다. 그러다 각 어노테이션의 정확한 역할과 적용되는 방식이 궁금해 미션을 진행하며 사용한 세 테스트용 어노테이션을 학습했다. @JdbcTest JDBC 기반 컴포넌트만 테스트하는 JDBC 테스트를 위한 어노테이션이다. 이 어노테이션을 사용하면 auto-configuration이 비활성화 되고, JDBC 테스트와 관련된 configuration만 적용된다. 기본적으로 가 붙은 테스트는 트랜젝션 처리가 되고, 각 테스트가 죵로된 후 롤백을 시행한다. 또한 명시됐거나 자동 설정된 DataSource 대신 인메모리 DB를 사용하게 된다.를 사용하면 이런 설정을 덮어쓸 수 있다. 전체 어플리케이션 설정을 사용하면서 인메모리 DB를 사용하고 싶다면, 이 어노테이션 대신 와 를 조합해 사용하는 게 낫다. 를 사용한다면 를 함…

May 29, 2022
Spring
[Spring] DB 연결 없는 컨트롤러 테스트에서 시작한 스프링 공식 문서 공부

사건의 발단 우테코 레벨1 마지막 미션인 웹 체스 강의에서 테스트 더블을 이용해 DB 연결 없이 DAO 객체를 테스트 하는 걸 배웠다. 웹 체스에 스프링 프레임워크를 적용하고 컨트롤러를 짜는데, 컨트롤러도 DB 연결 없이 테스트 할 수 있지 않을까? 하는 생각이 들었다. 체스방의 정보(id, name)을 담은 테이블을 대신 할 와 를 주입받는 를 만든 것 까진 아주 좋았다. 문제는 컨트롤러를 짜며 생겼다. 당초 계획은 를 주입받은 를 테스트 환경에서만 컨트롤러에 주입하기였다. 하지만 스프링에서는 사용자가 직접 new로 객체를 생성하지 않고 로 등록된 클래스를 스캔해 빈(Bean)으로 생성한다. 그래서 테스트에서만 필요한 객체를 주입 할 수가 없었다. 일단 해결은 했으나… 페어 더즈와 방법을 고민하다 지나가던 제이슨이 도와줘서 문제를 해결할 수 있었다. 먼저 test 폴더 하위에 를 추가로 작성해 프로덕션과 다른 설정이 적용되게 한다. 공식 문서에 따르면, 해당 설정은 이미 존재하…

April 25, 2022
Spring
우아한테크코스