반응형

분류 전체보기 486

[220928] 우아한테크코스 레벨4 - MVC 구현하기 미션 후기

이전에 진행됐던 `톰캣 구현하기` 미션에 이어 `MVC 구현하기` 미션이 시작됐다. 여기에서 1번은 HandlerMapping, 2번은 HandlerAdapter이다. 이번 미션에서는 위를 구현해보고 리팩터링하여 컨트롤러가 어떻게 찾아와지는지, 해당 메서드를 어떻게 실행시키고 ModelAndView로 반환시키는지 확인해보는 미션이다. 환경은 JSP 파일을 렌더링한 응답을 보내줘야 하는 SSR 환경이라고 가정한다. 1단계 - @MVC 프레임워크 구현하기 요구사항 AnnotationHandlerMappingTest가 정상 동작한다. DispatcherServlet에서 HandlerMapping 인터페이스를 활용하여 AnnotationHandlerMapping과 ManualHandlerMapping 둘다 처리..

[220924] 2023 KAKAO BLIND RECRUITMENT 코딩테스트 1차 후기

https://career.programmers.co.kr/competitions/2759 2023 KAKAO BLIND RECRUITMENT career.programmers.co.kr 2023 카카오 코딩테스트에 응시해보았다! 카카오는 내가 가고 싶은 기업 중 하나이기도 하고, 카카오 알고리즘 문제들이 꽤나 어렵다는 소문이 자자해 경험삼아 인프라 분야에 접수하여 응시해보았다. (주변 지인분들이 모두 백엔드로 지원했고, 난 아직 졸업예정자가 아니기 때문에 취업이 급하지 않아 경쟁률을 낮춰주기 위해 인프라에 넣은 이유도 있다.) 작년과 몇 가지 다른 점이 있었는데 아래와 같다. 정확성/효율성이 나누어지지 않았다. 작년에는 정확성만 챙기고 효율성이 터지는 경우는 점수를 절반이라도 챙길 수 있었지만, 이번에..

[QueryDSL] queryDSL 프로젝트 적용 후기 및 트러블슈팅

우테코 프로젝트에서는 Spring Data JPA를 사용하고 있었다. Spring Data JPA를 이용하면 인터페이스 생성 만으로도 SimpleJpaRepository에 내장된 다양한 CRUD 메서드를 활용할 수 있고, 추가로 커스텀 메서드도 편리하게 만들 수 있다는 장점이 존재한다. 그러나 Spring Data JPA는 동적 쿼리를 사용하기 어렵고 복잡한 쿼리는 @Query 어노테이션을 이용하여 JPQL을 직접 작성해주어야 한다는 문제점이 존재한다. 따라서 이번 기회에 queryDSL을 적용하여 컴파일 시점에 문법 오류를 잡아낼 수 있게 하고, 복잡한 쿼리를 리팩터링하는 데에 도전해보았다. 특히 위처럼 DTO를 반환하는 repository method의 경우 @Query로 작성하면 DTO 패키지명을 ..

[JPA] 벌크 Update, Delete 연산과 영속성 컨텍스트

벌크 수정연산과 벌크 삭제연산을 각각 수행한 후에 별도로 영속성 컨텍스트 초기화 작업을 하지 않았다고 가정하자. 이후에 전체조회 작업을 시행하면 update는 연산이 적용되지 않은 영속성 컨텍스트 데이터, delete는 연산이 적용된 DB 데이터 결과가 조회되는 것을 확인할 수 있다. 왜 그런 것일까? 이를 이해하기 위해선 영속성 컨텍스트를 제대로 이해하고 있어야 한다. 아래 예시와 함께 살펴보도록 하자. Update 벌크연산 상황 영속성 컨텍스트와 DB에 아래 데이터가 있다고 하자. 위 상황에서 아래와 같이 28살 미만은 이름을 전부 비회원으로 바꾸라는 bulk update 연산을 수행해보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void bulkUpdate..

[220913] 우아한테크코스 레벨4 - 톰캣 구현하기 미션 후기

레벨4에 들어서면서 그동안 우리가 흔히 사용했던 스프링에 대해 좀 더 딥하게 알아보고 구현해보는 시간을 가지게 됐다. 아래는 우테코 레벨4 일정이다. 그 중에서 첫 번째 미션은 [톰캣 구현하기]이다. 그 동안 우리는 스프링을 이용한 덕분에 HTTP 요청을 받으면 그에 맞는 응답을 편리하게 만들어줄 수 있었다. 이는 Dispatcher Servlet이 있었기에 가능한 것. 이번 미션을 통해서 WAS, tomcat, Dispatcher Servlet이 각각 무엇인지, 어떠한 역할을 하는지 배울 수 있었다. 특히 4단계의 '동시성 확장하기' 미션 덕분에 스레드, 스레드풀에 대한 개념을 공부할 수 있었다. 내 최종 코드 및 각 단계별 PR은 아래 레포에서 확인할 수 있다. https://github.com/wo..

[JPA] 쓰기 지연으로 인한 쿼리 실행 시점과 예외처리 및 기본키 생성 전략

최근에 흥미로운 글을 봤다. JPA 쓰기지연 기능 때문에 커스터마이징한 예외가 발생하지 않고 DataIntegrityViolationException 예외가 발생한다는 글이었다. service에서 repository의 delete 메서드를 실행하고, 만약 외래키 설정으로 인한 DataIntegrityViolationException이 발생하면 catch로 잡아서 커스텀 예외를 던지려 하는 상황이라 가정하자. 해당 서비스 메서드를 테스트할 때, 예외 상황으로 커스텀 예외가 발생할 줄 알았는데 catch로 잡지 못하고 DataIntegrityViolationException가 발생했다는 글이었다. https://velog.io/@giantim/5 @Transactional 과 JPA 사용 시 주의점 @Tra..

[Kotest] Nested Test spec에서의 context 생명주기 및 트랜잭션

코틀린 프로젝트에서 kotest로 테스트 코드를 짜다가 통과해야 할 테스트가 통과하지 않는 현상을 마주치게 됐다. 우리는 StringSpec과 유사한, 중첩되지 않은 구조에서 Given - When - Then 구조의 BehaviorSpec 스타일로 테스트를 마이그레이션하고 있었다. 위 두 테스트 코드는 아예 동일하다. 그저 계층만 나뉘게 바뀌었을 뿐. 구조에 따라 계층을 나누기만 하고, 순서 변경이라든지 코드의 변경이 없었으니 테스트는 당연히 문제 없이 통과할 줄 알았다. 그런데 결과는? Tests Failed... 당연히 WAITING에서 PASS로 변경될 줄 알았는데 Given에서 진행해준 update가 진행되지 않고 WAITING인 상태로 테스트가 진행됐다. 심지어 코드 변경은 전혀 없고 구조에 ..

[우아한테크코스] 레벨3 레벨로그 인터뷰 후기

우테코에서는 각 레벨이 끝날 때마다, 그 레벨에서 배웠던 내용을 기록하여 제출한다. 그리고 이 내용을 바탕으로 20분동안 크루 4~6명과 함께 코치님 또는 캡틴과 자유롭게 얘기를 나누는 시간을 가진다. 모의 면접이라고 생각하면 된다. 담당코치님은 랜덤으로 배정된다. 나의 경우는 레벨4를 시작하자마자 바로 다음 날에 레벨로그 인터뷰를 진행됐다. 나의 레벨로그 인터뷰를 맡아줄 코치님은 구구였고, 레벨3 때에도 함께한 알파, 리버도 있었으며, 릭, 렉스와도 함께 진행했다. 지금 생각하면 내 레벨로그 인터뷰 담당 코치님들은 다 빡센 분들과 함께 했던 것 같다 ㅎㅎ 이 날은 코치 구구가 컨디션이 좋지 않아 살살해준다고 말씀하시긴 했다. 내 레벨3 레벨로그는 여기서 확인할 수 있다. https://clean-nut..

[220819] 우아한테크코스 3차, 4차 데모데이 후기

레벨3가 끝이 나면서 우아한테크코스 데모데이도 4차 최종까지 끝이 나게 됐다! 원래는 3차와 4차를 따로 쓰려 했지만, 필자의 귀차니즘으로 인해 3차와 4차를 한꺼번에 묶어서 쓰게 됐다 ㅎㅎ 이와 함께 우리 프로젝트도 레벨3가 끝남과 동시에 출시가 됐다. 아직 리팩터링하고 싶은 부분, 구현하고 싶은 부분이 좀 남아있어서 메이저버전을 올리지 않은 0.4.1 버전이긴 하다. 하지만 자유롭게 모임을 생성해서 롤링페이퍼와 메시지를 쓰고 마이페이지에서 그에 대한 정보를 확인할 수 있으니 편하게 접속해서 롤링페이퍼를 이용해주면 좋을 듯하다. https://www.naepyeon.site/ 내 편 www.naepyeon.site 우리가 만든 프로젝트를 구경하려면 위 링크로 접속하면 된다 :) 모임 기반 롤링페이퍼 서..

[Spring] @SpringBootTest의 webEnvironment와 @Transactional

우리는 @SpringBootTest 어노테이션을 이용하여 손쉽게 통합테스트를 진행할 수 있다. 하지만 @SpringBootTest의 webEnvironment 설정에 따라 테스트 격리가 잘 되지 않는 현상을 발견할 수 있다. 왜 그런 것일까? @SpringBootTest의 webEnvironment @SpringBootTest를 파고 들어가면 아래와 같이 webEnvironment 세팅을 볼 수 있다. 기본값은 MOCK이다. WebApplicationContext를 로드하지만, 내장된 서블릿 컨테이너가 아닌 MOCK 서블릿을 제공한다. 실제 서블릿 환경에서 테스트를 진행해보고 싶다면 RANDOM_PORT나 DEFINED_PORT로 진행해주어야 한다. RANDOM_PORT랑 DEFINED_PORT는 위 사..

반응형