분류 전체보기25 스프링의 예외 누수 문제 해결 변천사 초기 상황 앞서 글에서 말했다시피 예외 누수의 문제가 남아있다. Repository에 현재 JDBC 기술을 사용하고 있고 JDBC 예외인 SQLException는 체크 예외이기 때문에 처리하거나 던져야하며, 이로 인해 Service, Controller도 해당 예외를 적어야한다.(throws) 즉, Service, Controller가 특정 예외에 의존하게 되는 것이다. (참고로 체크 예외, 언체크 예외의 기본 개념을 안다는 전체하에 설명할 예정이다.!!) 체크 예외를 사용할 시 어떤 파급 효과가 발생할 수 있는지 살펴보자. 기본적으로 예외들의 대다수는 복구 불가능 예외이므로, Service, Controller에서는 예외를 던지게 되고 스프링 인터셉터, controllerAdvice, 서블릿 필터에서 .. 2023. 6. 25. 스프링 인터셉터를 이용한 권한 검증 분리하기 문제 상황 사이드 프로젝트를 진행하면서 기본 인증/권한을 제외하고, 방장 및 팀원 권한 검증도 추가로 필요한 상황이였다. 초기에는 아래와 같이 Service layer의 메서드를 통해 검증을 진행했다. 하지만, 추가 검증이 필요한 도메인의 Service가 추가될 때 마다 해당 메서드들이 항상 추가되어야 됬었다. 좋지 않아.... 문제점을 정리해보자. 먼저, 인증 및 권한 검증은 비지니스 로직와 별개의 관심 사항이다. 또한, 같은 기능의 코드가 계속 반복되어 불필요한 중복 코드가 발생한다. 이러한 문제를 Filter, Spring Interceptor, AOP 등을 사용해서 해결할 수 있다.위 기술들 모두 이를 해결할 수 있지만, 컨트롤러에 전달되는 Request, Reponse를 처리하거나, 새로운 데이.. 2023. 6. 14. 넥스터즈 23기 지원서 후기🤣 많은 전국 IT 동아리 중에서도 탑티어로 뽑히는 넥스터즈 동아리에 지원서 작성 부터 면접까지 후기를 공유해보고자 합니다. 또한, 작성한 지원서 및 면접 질문들도 기억나는 대로 적어 보도록 하겠습니다.😊 혹시나, 넥스터즈 동아리에 대해서 잘모르시는 분들은 확인해주세요. :) https://teamnexters.com/ NEXTERS : IT Community for Experts teamnexters.com 넥스터즈 23기 지원서 이전에 넥스터즈 22기 뿐만아니라, Mash-up, DND, YAPP, 프로그라피 등 많은 IT 동아리에 지원했었지만 매번 서류 광탈을 당했고 자신감이 무척 떨어진 상태였습니다.....쩝... 현재 대학생 4학년이고, 이번이 학부생 시절 전국 IT 동아리 경험은 마지막이라는 생각.. 2023. 6. 11. 스프링 트랜잭션 AOP 등장까지의 변천사 스프링 트랜잭션 AOP가 등장하기 전 이전의 문제점들을 정리해보고 어떠한 매커니즘으로 동작하는지 정리하고자 한다. 그 과정에서 등장하는 스레드 로컬을 사용한 트랜잭션 동기화 매니저, 템플릿 콜백 패턴, 스프링 AOP 등의 기술과 자세한 동작 방식은 추후 자세히 정리해보도록 할 것이다. 지금은 트랜잭션 AOP가 등장하기까지의 배경 및 변천사를 중점적으로 정리해보겠다. 문제의 시작 기본적으로 트랜잭션의 시작과 끝은 비지니스 로직이 있는 Sevice 계층에서 시작하는 것이 좋다. 예를 들어 비지니스 로직 중 계좌의 돈을 차감하고 또 계좌의 돈을 추가하는 두개의 기능이 있는데, 예외로 인해 일부만 commit 되고 일부는 rollback되면 어떨까? 심각한 데이터 적합성 등 문제가 발생할 것이다. 그러므로 비지.. 2023. 5. 27. 트랜잭션 이해와 락 트랜잭션의 이해 트랜잭션(Transaction)이란, 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하는 작업의 단위이다. 트랜잭션은 ACID라는 원자성, 일관성, 격리성, 지속성을 보장하게 된다. 각 특징의 의미를 하나씩 정리해보겠다. 원자성(Atomicity) 트랜잭션 내에서 실행한 작업들은 모두 성공하든지, 실패해야만 한다. 일관성(Consistency) 모든 트랜잭션은 데이터베이스의 상태를 일관성있게 유지해야된다. 데이터베이스 객체, 참조 무결성 제약조건을 만족해야하는 것이 예로 될 수 있다. 격리성(Isolation) 동시에 실행 중인 트랜잭션은 서로 영향을 미치지 않도록 격리된 환경에서 독립적으로 수행되어야 된다. 격리성은 동시성과 관련하여 성능 이슈가 있기 때문에 격리수준을 정할 .. 2023. 5. 24. 커넥션 풀과 데이터소스 서론 데이터베이스 커넥션을 획득하기 위해서는 아래와 같은 복잡한 단계를 거치게 된다. 커넥션을 맺을 수 있는 DB 드라이버(H2, MySQL 등)를 찾는다. DB 드라이버와 3-way-handshake 를 통해 TCP/IP 연결을 맺는다. ID, PW와 기타 부가정보를 DB 전달하고, DB는 전달받은 ID,PW 를 통해 내부 인증을 완료하고 DB 세션을 생성한다. DB는 커넥션이 생성됬임을 알리고, DB 드라이버는 커넥션 객체를 생성해서 클라이언트에게 반환한다. 오버헤드가 너무 큰데??.... 맞다!! 데이터베이스와 커넥션을 맺는것은 복잡하고 시간도 오래 걸린다. 그럼 미리 커넥션을 만들고 필요할때 주면 되는거 아니야??... 맞다!! 어플리케이션 로딩 시점에 필요한 만큼의 커넥션을 미리 생성해둔 후, .. 2023. 5. 20. 복합 컬럼 인덱스를 이용한 쿼리 성능 개선하기 사이드프로젝트 간 인덱스를 이용한 쿼리 조회 성능 사례를 정리하고자 한다. 상황 위는 현재 ERD 상태 이고, 사용자(user)와 봉사 모집글(recruitment)에 이미지를 업로드 할 수 있고 추가로 로그 테이블도 존재하기 때문에 이미지 테이블을 분리시켜 놓았다. 봉사 모집글의 상세 정보를 조회하는 상황에서 참여자 리스트의 정보(닉네임, 이미지 등)가 필요하였다. JPA를 사용하는 상황에서 봉사 모집글의 참여자 정보는 Fetch Join, EntityGrapth 등의 기술로 가져올 수 있었지만, 참여자의 이미지는 함께 가져오지 못해 별도의 쿼리를 사용했다. 아래는 문제의 비지니스 로직의 부분이다. 참여자들의 수(N)만큼 이미지 쿼리가 발생했고, 초기에는 대수롭지 않게 넘겼다. 테스트 케이스 실행 중 .. 2023. 5. 19. 이전 1 2 3 다음