본문 바로가기

분류 전체보기

(21)
동적인 쿼리를 만들어줘! QueryDSL 입문기 최종 프로젝트 Triplan을 개발하면서 QueryDSL을 사용하게 되었습니다. QueryDSL을 어떤 상황에서 왜 사용했는지 그래서 뭐가 좋아졌는지 정리해보도록 하겠습니다. 문제 상황 서비스 요구 사항 : 검색 조건(도시, 여행 테마, 검색어)에 맞는 게시글을 조회한다. Triplan 프로젝트에 위와 같은 서비스 요구사항이 있었습니다. 여기서 문제 상황은 도시와 여행 테마, 검색어 모두 조건이 있을 수도 없을 수도 있다는 점 때문에 발생하였습니다. 도시는 전체 또는 특정한 도시(서울, 부산 등등)를 입력받았고, 여행 테마 또한 전체 또는 특정한 테마(액티비티, 맛집 투어 등등)를 입력받았습니다. 도시나 테마만 입력받고 전체 게시글을 조회할 수 있으므로 검색어가 아예 없는 경우도 고려해야 했습니다. 저희..
데브코스 수료!! 마지막 회고록 설렘과 걱정의 마음으로 시작했던 프로그래머스 백엔드 Devcourse 과정이 5개월이 지나 막을 내렸다. 5개월 동안 교육을 받으면서 개발, 협업 등 많은 것을 학습해왔다. 그럼 5개월 전의 나는 어떤 사람이었고 데브코스 과정을 듣는 5개월 동안 어떻게 성장했는지 기록해보자. 전체적으로 적긴 했지만 그래도 최종 프로젝트 끝난 뒤의 회고록이어서 최종 프로젝트 위주로 작성해보았다. 데브코스 시작 전의 나 나는 원래 노는 것을 좋아했던 대학생이었다. 탁구에 빠져서 휴학하고 6개월 동안 오로지 탁구만 친 적도 있었고, 1년 동안 워킹홀리데이로 호주도 다녀왔었다. 놀면서 공부도 같이 했으면 좋았으려 만 안타깝게도 공부도 잘 안 했었다. 4학년이 돼서야 부랴부랴 ‘뭘 해야 할까?’ 고민하다가 ‘안정적인 직업이 좋지..
Spring Data JPA 는 어떻게 interface 만으로도 동작할까? (feat. reflection, proxy) Spring Data JPA를 공부하면서 궁금한 것이 있었습니다. public interface MemberRepository extends JpaRepository { List findAllByName(String name); } 위와 같이 MemberRepository는 인터페이스고, @Repository 애노테이션을 붙여 놓지도 않았는데, 다음과 같은 코드가 가능했습니다. @Service public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository..
AOP가 동작하는 원리 프로그래머스 데브코스 중간 프로젝트가 끝났습니다. 그래서 최종 프로젝트가 되기 전에 스프링 강의 때 배웠던 내용을 복습할 겸 강의 중에서 제일 이해하기 어려웠던 AOP에 대해서 공부하고 정리해보고자 합니다. 그럼 출발~ AOP ( Aspect Oriented Programming ) AOP는 관점 지향 프로그래밍입니다. 쉽게 말해 어떤 로직을 기준으로 핵심 기능과 부가기능으로 나누고 그 관점을 기준으로 각각을 모듈화 하겠다는 것입니다. 글보다는 간단한 코드 예시로 알아보도록 하겠습니다. @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; public Order orderItem(..
데브코스 중간 팀 프로젝트 회고록 지금까지 프로젝트를 할 때는 대부분 정해진 틀 없이 주먹구구 식으로 진행을 했었습니다. 하지만, 데브코스에서 프로젝트를 할 좋은 기회가 있어 이번 프로젝트는 처음으로 프로젝트다운 프로젝트, 협업다운 협업을 할 수 있었습니다. 그래서 이번에 어떤 식으로 프로젝트를 진행했는지 짧게 정리하고 회고를 남겨보도록 하겠습니다. 프로젝트 진행 과정 우리는 3명의 팀원으로 프로젝트 팀이 구성되었습니다. 저 포함 팀원들은 아직 프로젝트의 진행 순서나 팀적인 규칙 등을 어떻게 정하고 진행해야 하는지 모르는 부분이 많았습니다. 그래서 여러 블로그를 참조하고 멘토에게 조언을 얻어 프로젝트를 어떻게 진행해야 하는지 힌트를 얻을 수 있었습니다. 총 2주의 기간을 고려해서 일정을 정했습니다. 1주차는 도메인 분석, 요구사항 정의,..
후반전 시작 - 데브코스 9주차 정리 전후반 사이, 하프타임에 (추석 기간) 에너지를 만땅으로 충전했다. 이제 후반전이 시작되었는데 전반전과 비교했을 때 어떤 점이 달라졌는지 정리해보자. 선수 교체 후반전이 시작되면서 멘토와 팀원들이 새롭게 구성됐다. 멘토 분은 열정 넘치는 투머치 토커다. 팀원들과의 첫 만남에서 백둥이들에게 바라는 점, 팀 활동에 대한 방향성 등에 대해 아주 열정적으로 설명을 해주었다. 무려 2시간 동안,, 살짝 힘들긴 했지만 그래도 무관심보다는 열정 넘치는게 훨씬 좋다. 다른 팀원들도 모두 개성이 넘친다. 특히, 그 중에서 한 명은 스크럼할 때 종이에 "Good", "Yes" 가 적힌 종이를 카메라에 비추며 리액션을 한다. 사소하지만 센스있는 행동으로 팀 분위기를 편안하게 만들어주었다. 새로운 종목 전반전은 Spring ..
Spring에서의 예외 처리 및 에러 페이지 서블릿에서 기본 예외 처리 클라이언트로부터 요청이 들어오면 흐름은 다음과 같습니다. WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 (예외 발생) 여기서 예외가 발생하면 throw 된 예외는 다시 아래와 같이 전달됩니다. WAS 컨트롤러 (뷰 반환) 참고 : 에러 요청은 dispatcherType.ERROR로 설정해서 보내기 때문에 필터를 무시하고, 인터셉터에서는 에러 페이지들을 exclude 함으로써 무시할 수 있습니다. 하지만, 이 흐름을 위해서 개발자가 예외 코드에 따른 url을 매핑시켜야 하고, 예외 종류에 따라 에러 페이지를 만들고 예외 처리용 컨트롤러를 만들어야 합니다. 다행스럽게도 스프링 부트는 이 모든 걸 대신해줍니다. 스프링 부트 - 에러 페이지 스프링 부트는 기본적으로 Bas..
'추석 휴게소' 입성. 데브코스 중간점검 백엔드 데브코스 수료를 향해 가는 길, 약 50일의 시간이 경과했다. 마침 추석이 다가오면서 잠깐 쉬어가는 시간이 생겨 중간점검 회고록을 써보려고 한다. 글 컨셉은 추석 고향길에 휴게소에서 쉬는 것에 빗대어 보았다. 수료라는 목적지를 향해 가다가 추석 기간 동안 잠시 쉬어간다는 내용이다. 교통 체증 수료를 향해 달리는 와중에 난폭 운전 차량들이 교통 체증을 유발하고 있었다. 오류 설정 문제, 버전 문제와 등등 사소하고 다양한 오류들 때문에 길이 막혀 속도를 내지 못했다. 특히 서블릿이나 JDBC 관련 오류는 자바 코드처럼 디버깅 할 수도 없어서 문제를 해결하는데 시간이 엄청 걸렸다. Embedded mysql 문제의 경우 결론은 버전 호환 문제였는데, 다른 부분이 문제인 줄 알고 해결하려다가 시간을 엄청..