개발 블로그
JPA의 영속성 컨텍스트에 대해 설명해주세요
기술 면접 질문 2023. 7. 21. 13:14

영속성 컨텍스트란 영속성 컨텍스트는 '엔티티를 영구 저장하는 환경' 이라는 뜻으로 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 다만 영구 저장한다고 해서 물리적으로 영구 저장되는 것은 아니고 트랜잭션 단위의 휘발성 메모리 공간이다. 영속성 컨텍스트의 장점 1차 캐시 영속성 컨텍스트는 엔티티가 영속성 컨텍스트에 1차 캐시에 있을 경우 DB 까지 접근하지 않고 메모리에 있는 1차 캐시에서 엔티티를 바로 불러오는 방식으로 동작한다. 만약 1차 캐시에 없을 경우 DB 까지 접근해서 가져온 엔티티를 1차 캐시에 저장하여 이후부터는 1차 캐시를 통해 조회할 수 있도록 한다. 이로 인해 성능상 이점을 누릴 수 있다. 동일성 보장 1차 캐시에서 엔티티..

Spring MVC 에서의 예외 처리 기법에 대해 설명해주세요
기술 면접 질문 2023. 7. 21. 13:01

BasicController 스프링은 기본적으로 예외를 처리하기 위한 BasicController가 구현되어 있다. Controller 에서 예외가 발생하면 이 예외는 'Controller -> Interceptor -> Distpathcer Servlet -> Filter -> WAS' 를 거쳐 WAS(Tomcat) 까지 전달되고 WAS 에서 '/error' 로 다시 요청을 보내 BasicController 를 호출하고 예외를 처리하도록 동작한다. BasicController 에서 반환하는 값은 'WhiteLabel 페이지'나 "status : 500", "error" : "Internal Server Error" 로 고정된 응답들인데 이는 상황에 따라 다른 상태 코드나 에러 메시지를 반환하여 클라이언..

article thumbnail
20529번. 가장 가까운 세 사람의 심리적 거리
Algorithm/백준 알고리즘 2023. 6. 30. 10:47

1. 아이디어 1. 브루트포스 방식으로 모든 케이스에 대해서 탐색하되 2. MBTI의 종류가 16가지라 입력값의 갯수가 32개를 초과하면 반드시 동일한 MBTI가 3개 이상 입력값에 존재하므로 3. N > 32 면 0을 N 32) { sb.append("0").append("\n"); continue; } int min = 12; for (int i = 0; i d) { min = d; } } } } sb.append(min).append("\n"); }..

[WIL] 프로젝트 회고
항해99 2023. 6. 25. 19:27

실전 프로젝트가 거의 마무리 되고 문서화 단계에 돌입해서 그 동안 했던 것들은 되돌아 보고자 한다. 나는 프로젝트에서 데이터 수집/생성/관리, 동시성 문제 해결, 코드 리팩토링, 테스트 코드 작성 등의 작업을 맡아서 했다. 프로젝트를 하면서 가장 어려웠던 것은 의사결정이었다. 하나의 문제를 해결하는 데에도 여러가지 방법이 존재했고 다양한 방법 중 어떤 방법을 선택할 것인가를 결정해야 했는데 이론적인 내용으로 알고 있던 것과 실제로 테스트 했을 때의 결과가 다를 때 어떤 기준을 따라야 할 지 결정이 어려웠다. 특히 동시성 문제를 해결하는 파트에서 이론적으로 학습했을 때는 분산 환경에서 Redis를 이용한 방식이 성능이 뛰어나다고 알고 있었는데 실제로 테스트를 했을 때는 락의 범위가 상대적으로 좁은 비관적 ..

[WIL] Week 9
항해99 2023. 6. 5. 09:01

이번 주는 동시성 문제를 해결하기 위해 사용할 수 있는 다양한 방법들에 대해 알아보고 적용하는 시간을 가졌다. 어떤 방법을 선택할 것인가에 대해서 성능 테스트(기준 : TPS) 를 통해서 결정하고자 했으나 결과가 조금 이상했다. 예상하기로는 각각의 방법들의 성능 차이가 거의 없거나 혹은 Redis 를 이용한 방법이 좀 더 성능이 우수할 것이라고 생각했는데 비관적 락을 사용한 방법이 가장 성능이 우수했다. 강의를 듣고 질문을 한 결과 요청 수(스레드 수)가 너무 적으면 그런 결과가 나올 수도 있으며 실제로 분산 서버가 필요할 만큼의 많은 트래픽이 발생하는 경우에는 Redis를 사용하는 방법이 확실히 성능 면에서 우수하다는 답변을 들을 수 있었다. 그래서 성능 테스트 시 동시에 발생하는 스레드의 수를 더 늘..

[WIL] Week 8
항해99 2023. 5. 29. 15:21

드디어 실전 프로젝트에 돌입했다. 도전하기로 한 주제들에 대해 팀원 모두 지식이 없다보니 우선 공부를 한 후에 코딩을 하자고 했었는데 서로 학습 진도가 달라 어려움이 있었다. 결국 관심 있는 주제를 선택해 A-Z까지 해당 인원이 맡아서 진행하는 방식으로 변경했다. 그렇게 한 주를 보냈는데 개인적으로는 스스로를 질책하고 싶고, 질책해야만 하는 한 주였던 것 같다. 아무래도 이전에 했던 미니프로젝트나 클론코딩 프로젝트에 비해서 시간적으로 여유가 있다보니 더 깊게 학습하고 더 고민하는 과정이 수반되어야 하는데 나는 여전히 구현에만 급급한 상태였다. 실제로 피드백을 들을 때도 너무 한 번에 정답으로 가려고 하는 것 같다는 얘기도 들었다. 앞으로는 내가 어떤 것을 적용하면 이걸 왜? 어떤 의사결정 과정에 기반해서..

[TIL] DAY 47
항해99 2023. 5. 19. 22:13

지난 클론코딩 프로젝트에서 예약하기 기능을 구현하고 동시성 문제를 해결하기 위해 몇 가지 방법을 적용한 결과 중 이해가 안 가는 부분이 있었는데 오늘 추가로 학습을 진행하면서 이해하게 된 부분을 정리하고자 한다. 예약하기 메서드를 synchronized 메서드로 만들었을 때 왜 2명 동시 예약이 됐을까?? 이 부분에 대해 이해를 하지 못 했었는데 스레드가 임계영역을 탈출하면서 Lock을 반납하고 트랜잭션의 커밋이 이루어지는 사이에, 그 사이에 다른 스레드가 임계영역에 진입해 데이터 조회를 하게 되면 이전 스레드에 의해서 발생한 쿼리문들의 결과가 데이터베이스에 반영이 되지 않은 상황이므로 동일하게 예약이 가능하다고 나오게 되는 것이었다. 나는 트랜잭션의 커밋이 되고 난 후에 메서드가 종료된다고 착각하고 있..

[TIL] DAY 45
항해99 2023. 5. 18. 21:09

예약하기 서비스 동시성 문제 해결하기 하나의 숙소에 겹치는 기간으로 2명이 동시에 예약을 시도할 경우 -> 처음에 만든 로직으로는 2명 다 예약이 성공함 시도1. synchronized 를 통해 어플리케이션 단에서 제어하기 -> 스프링 프레임워크에서 IOC 컨테이너에 빈 객체를 만들고 주입하는 방식이기에 모든 요청에서 동일한 서비스 객체를 사용하므로 인스턴스 메서드에 synchronized 해줘도 해결이 될 거라고 생각 -> 그런데 그대로 2명이 다 예약됌 시도2. 비관적 락을 통해 DB 단에서 제어하기 -> 비관적 락을 걸면 하나의 트랜잭션이 커밋을 하기 전까지 다른 트랜잭션이 데이터에 접근하지 못 하므로 해결될 것으로 예상 -> 하나의 트랜잭션에 의해서 DB에 데이터가 저장이 됐음에도 마치 커밋이 안..