본문 바로가기

스프링부트17

[Redisson] 트랜잭션 문제 발생 및 해결 지난 포스트 [Redisson]을 이용한 분산 Lock 구현 & 동시성 문제 해결 내 프로젝트의 Payment를 개발하면서 가장 기본 중에 기본이 되는 문제를 직면했었다. 그것은 바로 동시성 문제! 스프링부트의 내장 서버는 기본적으로 톰캣, 언더토우 등등의 WAS로 돌아가는데 이 sweeeetgoguma.tistory.com 지난 포스트에서 Redisson을 이용하여 동시성 문제를 해결하는 코드를 구현했다. 프로젝트 리팩토링이 거의 끝나가 조회 API를 구체화하여 몇 개 추가하던 도중, 스레드 100개의 동시 요청을 직접적으로 받는 과정을 확인하고 싶어졌다. 그래서 실험해봤다. 결과는?? 처참하다.. 무엇이 문제였을까 트랜잭션 처리가 씹혔다. @GetMapping("/test") public void t.. 2022. 10. 1.
Spring Security [2] - 예외 처리 AuthenticationEntryPoint & AccessDeniedHandler 서큐리티를 도입하며 인증, 인가의 과정을 마쳤다. 이제 인증 및 인가 작업에서 발생하는 예외에 대해서 처리를 해주어야 하는데, 한 가지 생각해봐야 하는 문제가 있다. 스프링 서큐리티는 필터에 기반한 체이닝 구조이므로, 스프링 컨테이너까지 요청이 도달하지 않는다. 따라서, @ExceptionHandler를 통한 편한 예외 처리가 불가하다. 직접 Try - catch로 잡아서 응답을 내려주는 방법 밖엔 없다. 하지만, 스프링 서큐리티가 그렇게 허술하진 않다. 서큐리티 필터 체인의 구조를 보면 마지막 즈음에 예외를 처리하는 필터가 있는 것을 확인할 수 있다. 여기서 주로 사용하는 AuthenticationEntryPoint와 AccessDeniedHandler를 구현해 인증 및 인가 과정에서 일어난 예외에 대.. 2022. 8. 21.
JPA 개념 정리 JPA 책을 이제 막 다 읽었다. ORM을 처음 공부한다는 생각에 긴장이 많이 됐지만, DB 공부도 하고, 객체지향에 대한 공부를 충분히 한 상태여서 그런지 생각보다 기존에 읽었던 real mysql, 토비의 스프링 3.1보다 잘 읽혔다. 기존에 database layer는 Mybatis 프레임워크를 이용해 구현했지만, 이는 문제가 있었다. SQL 중심의 개발이 되는 것이다. 앞으로 할 일이 많이 남았으므로, JPA로의 리팩터링을 슬슬 시작해보자. JPA Java Persistence API 자바 진영의 ORM 표준 기술 ORM Object Relational Mapping 객체와 관계형 데이터를 매핑 데이터를 객체에 저장할 수 있다. Hibernate 가장 많이 사용되는 ORM 프레임워크 JPA 인터페.. 2022. 7. 15.
리팩터링 「Authentication(인증)」 태어나서 처음 회사에 지원했다. 서류를 여러 군데 넣었다. 벌써 서류 탈락만 3번째이다. 서류 탈락이 이런 기분이구나...ㅎㅎ 회사 기준에 부합하지 않는 내 실력과 결과물 탓이지 뭐. 더 열심히 다듬어야겠다. 서류를 다듬다가 인증과 인가 구현 중 이슈를 작성했던 부분이 눈에 띄었다. 인증과 인가... 음... 인가는 애노테이션을 이용해 인터셉터로 구현한 명확한 근거가 있었다. 인증은 좀 애매했다. JWT 토큰을 인증하는 부분은 굳이 인터셉터까지 도달할 필요가 없다. 그래서 인증 작업을 인터셉터에서 필터로 리팩토링을 진행했다. 필터(Filter)란? HTTP 요청과 응답을 거른 뒤 정제할 수 있는 기능이다. Servlet Container 단에서 동작한다. 스프링 범위 밖에서 처리된다. Dispathcer.. 2022. 7. 11.
「컨트롤러 단위 테스트」 https://github.com/GroovyArea/MyChickenBreastShop GitHub - GroovyArea/MyChickenBreastShop: ChikenBreastShop API with Spring boot ChikenBreastShop API with Spring boot. Contribute to GroovyArea/MyChickenBreastShop development by creating an account on GitHub. github.com 저번 주에 처음으로 단위 테스트를 공부하고 적용시키며 Spring REST Docs를 이용해 적용시켰다. 처음 단위 테스트를 작성하다 보니 미흡한 부분이 좀 있었다. 그 부분을 수정해가며 다른 컨트롤러의 단위 테스트를 추가로 작성.. 2022. 6. 23.
「OutBox Pattern」 활용 https://github.com/GroovyArea/MyChickenBreastShop/wiki/Version-1 GitHub - GroovyArea/MyChickenBreastShop: ChikenBreastShop API with Spring boot ChikenBreastShop API with Spring boot. Contribute to GroovyArea/MyChickenBreastShop development by creating an account on GitHub. github.com 프로젝트 초기 작성한 Wiki 문서에서 계획한 기능은 다 구현이 되었다. 게시판, 배송, 채팅 기능 같은 경우는 부수적이므로 다양한 기능을 얕게 구현하는 것보다 기능 하나를 구체적으로 고려하며 구현하는 .. 2022. 6. 10.
2022.06.01 「결제 API - Ver.2」 지난번 포스팅에 이어 작성하겠다! https://sweeeetgoguma.tistory.com/entry/20220529-%E3%80%8C%EA%B2%B0%EC%A0%9C-API%E3%80%8D 2022.05.29 「결제 API」 장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 하는데, 생각만큼 쉽지 않았다. 어디서 본 건데 sweeeetgoguma.tistory.com 카카오페이 Rest API를 이용해 결제 준비에 필요한 객체를 설계하는 것까지 완료했다. 카카오 페이 프로세스에 따라 준비와 결제 및 승인을 위한 통신 객체를 생성해야 한다. 이 과정 속에서 수많은 삽질이 있었다. 사실 삽질이라기보다.. 2022. 6. 1.
2022.05.29 「결제 API」 장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 하는데, 생각만큼 쉽지 않았다. 어디서 본 건데 만들어진 API를 가져와서 쓰는 것도 능력이라고..ㅋㅋ 그래도 해야지 어쩌겠나. 카카오 페이 API 문서를 보니 되게 다양한 API를 소개해 놓았다. 결제 요청도 보안상 서버를 통해 요청을 해야 된다고 한다. 그리고 넘겨 주고 받는 파라미터도 굉장히 많다. 실거래를 위해 만들어진 API라 확실히 다르긴 하다. 개인적인 프로젝트 수준에서 테스트 결제를 위해 필요한 데이터를 추리는 작업은 참 골치 아픈 일인 것 같다. 일단 결제 요청 부터 시작하기로 결정했다. 내가 설계한 프로젝트에서는 크게 보면 두 가지 종.. 2022. 5. 29.
2022.05.28 「쿠키 수정」 장바구니 API를 처음 구현해보는 쿠키로 힘들게 짰었다. 오늘 주문 API를 구현하려고 카카오페이 관련 API 탐색 및 구상을 하던 도중 장바구니 데이터를 가지고 결제하는 경우를 떠올렸다. 다시 한번 장바구니 API 동작이 잘 되는지 포스트맨으로 확인을 하던 도중 이상한 쿠키 에러가 발생하는 것을 발견할 수 있었다.. 다시 한번 점검을 통해 코드 수정을 하며 단번에 완벽한 코드를 작성한다는 자만심 느꼈던 자신에 반성을 하게 되었다..ㅎㅎ 문제점 장바구니 상품 추가가 되질 않는다 쿠키가 다중으로 생성된다 => 이 두 가지 문제가 제일 컸다 기존 코드 장바구니 쿠키를 수정하여 response 객체에 삽입한다. 문제 새로운 쿠키가 같은 Key를 가진 객체가 생성되어 저장된다. => 내가 원한 건 기존 쿠키를 .. 2022. 5. 28.
2022.05.22 「Shopping Cart API [Ver.2]」 어제부터 장바구니 API 구현에 대해 고민을 정말 많이 했다. 당연히 DB를 이용하다 쿠키로 구현해보려는 시도가 처음이라 더 개념이 낯설었다. 추가 및 조회는 끝났는데, 오늘 아침 다시 보니 추가에서 이상한 로직이 있었고, 중복되는 코드가 있어서 수정을 하고 장바구니 수정 및 삭제 API를 작성해보았다. API를 설계하면서 문제점들과 확실히 알게 된 점을 정리해보겠다~ 장바구니 조회 장바구니를 조회한다는 것은 곧 장바구니에 들어있는 상품 목록의 데이터를 얻겠다는 것. 그 상품 목록의 객체를 설계했다. public class CartItemDTO { private final Integer productNo; private Integer productStock; private final String prod.. 2022. 5. 22.
2022.05.21 「 Shopping Cart API 만들기 」 어제부로 인증, 인가 작업이 완료되었다. 진짜 오래 걸렸다. 속도를 좀 더 낼 필요가 있다. 오늘부터는 장바구니를 만들건대 이번에는 DB를 이용하지 않을 것이다. 쿠키를 이용해 볼 생각이다. 쿠키에 장바구니 관련 정보를 넣어서 클라이언트에게 응답하는 것이다. 한 때 장바구니에 들어가는 데이터도 중요하다고 생각을 했는데 보통 장바구니는 쿠키나 로컬 스토리지를 이용한다고 한다. 나는 온전한 API로만 구현을 하고 있기 때문에 쿠키를 통해 구현해볼 생각이다. 장바구니를 어떻게 구현할까? 일단 DB에 저장을 따로 하지 않고 쿠키로 구현을 하기로 결심했다. 주요 기능을 생각해보았다. 기능 1. 상품을 장바구니에 추가 2. 장바구니에 담긴 상품 목록 조회 => 수정과 삭제가 없는 이유는 프런트단에서 할 수 있지 않.. 2022. 5. 21.
2022.05.17 「@Transactional 옵션 및 성능」 스프링 부트 프로젝트를 하던 도중 Service 클래스에서 @Transactional 사용에 옵션을 설정할 수 있다는 것을 처음 알았다. 옵션을 한번 추가해보라는 피드백을 받고 한번 이 에너테이션에 대해 알아보기로 했다. 프로그램 성능에 직접적인 영향을 끼칠 수도 있는 중요한 옵션이기 때문에 한번 정리를 해보겠다. 트랜잭션(Transaction)의 정의 데이터 베이스의 상태를 변경할 때, 한번에 수행되어야 하는 연산 트랜잭션 ACID 성질 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나 해야한다. 일관성(Consistency) : 트랜잭션은 일관성 있는 DB 상태를 유지해야한다. 작업 처리의 결과가 항상 일관되어야 함. 독립성(Isolation) : 동시에 실행되는.. 2022. 5. 17.
2022.05.14 「JWT 인증」 인증을 구현하기 위해 기존에 사용하던 Session 로그인이 아닌 JWT를 이용하여 인증을 구현했다. 토큰을 처음 사용했다 보니 알아가는데 너무 오래 걸렸다. 무엇보다 나는 스프링 시큐리티를 사용하지 않고 서블릿 필터나 스프링 인터셉터를 이용해 토큰 유효성 검사를 하려고 했어서 더 쉽지 않았던 것 같다. 이번 프로젝트 인증에서 Session을 사용하지 않은 이유는 서버의 규모가 확장될 때의 인증 문제이기 때문인데 JWT를 이용한 인증도 여러 가지가 있기 때문에 나의 프로젝트에 맞는 단계가 어디인지에 상당히 헷갈렸던 한 주였다. 인증 작업을 하며 문제가 생겼던 부분이나 구현한 부분에 대해 정리를 해보겠다. Rest API를 설계할 때 인증은 session 기반이 아닌 토큰 기반으로 하는 것이 더 restf.. 2022. 5. 14.
2022.05.01 「View 만들기, Insert, Select 작업」 ▶ 주간 정리 1. 항상 구상했던 계획보다 늦어진다는 점 (주관적인 평가로 성과가 기대보다 떨어진다)? > 욕심이 많은 건가 생각이 든다. > 다른 생각을 하지 말고 집중할 수 있을 때 더 해보는 것으로! 2. mysql을 공부하며 어려웠던 점 > 책만 보는 것이 아닌 예제를 검색해보거나 직접 쿼리를 작성하면서 함 > 읽는 거보다 확실히 경험하는 게 머리에 잘 남는다. 3. 쉬고 싶은 욕구 > 솔직히 7일 내내 하루종일 실내에 박혀 모니터만 바라보고 있는 것이란 쉽지 않다.. (핑계다) > 적절한 때에 좀 쉬는 것으로 (잠 더 자기, 2시간 정도 친구와 밥 약속이라던지 등) 4. 프론트 관련 > 난 정말 front와 안 맞는다고 생각한다. 태그들을 보기만 해도 울렁거린다. > 그래도 해야 하니 이번 프로.. 2022. 5. 1.
2022.04.29 「부트스트랩 관련」 ▶파트 1 (10시 ~ 2시) 1. mysql Ch.10 실행 계획 (2. 부트스트랩 관련 문의) => 되면 3. 프로젝트 html 정리 ▶파트 2 (3시 ~ 6시) 1. 부트스트랩 폴더 추가(느려지니 나중에 하자) 2. 자소서 수정 3. Controller 정의 ▶프로젝트 관련 1. 페이징 처리 시 DB 요청 => mysql 이므로 oracle의 rownum을 사용하지 못 한다. 하지만 비슷하게 따라할 수는 있다. 그래도 mysql을 배웠기 때문에 차별화된 방식을 사용할 것. => 방식은 여러 가지이지만 limit 함수를 사용한다. (검색 속도가 빠름) 2022. 4. 29.
반응형