팀 프로젝트/최종 프로젝트36 AOP(트랜잭션)와 try-catch 개요2025.03.08 - [팀 프로젝트/최종 프로젝트] - 트러블슈팅: 크롤링 시 트랜잭션 범위가 너무 길다 트러블슈팅: 크롤링 시 트랜잭션 범위가 너무 길다현재 문제점크롤링을 진행하는 메서드 전체에 트랜잭션이 잡혀있다.크롤링 해올 페이지가 적은 상황에선 문제가 안 되지만, 여러 페이지를 한 트랜잭션에 포함시킬 때 문제가 될 수 있다.중간roqkfchqh.tistory.com이 문제를 해결할 때, 한 클래스 내에서 트랜잭션 같이 사용하면 정상적으로 작동하지 않는다는 걸 어렴풋이 알고는 있었지만,왠진 모르겠지만 그냥 되길래(??) 잠시 묻어두고 넘어갔었다. 그러다 지금 AOP를 공부하다가 깨달았다.Spring의 트랜잭션은 AOP 기반이다. 즉, 프록시를 통해 메서드가 호출될 때만 트랜잭션이 적용된다. 그.. 2025. 3. 27. LazyInitializationException 개요프로젝트 기간에 발생했던 오류다. 시간에 쫓겨 정확한 원인을 파악하지 못한 채로 해결했었는데, JPA 공부를 하다가 깨달은 부분이 있어서 되짚어보기로 했다북마크를 조회할 때, LazyInitializationException이 발생했다.개발하신 분 환경에서는 오류가 발생하지 않았지만, 운영 환경과 내 로컬 환경에서는 동일한 오류가 발생했다.이로 인해 개발자 분께서 직접 디버깅이 어려운 상황이었고, 내가 수정해야 하는 상황이었다.비슷한 맥락으로 이런 오류도 볼 수 있다. 지연 로딩과 프록시지연 로딩이란, 연관관계를 가진 엔티티를 즉시 불러오지 않고 실제로 사용할 때 까지 로딩을 미루는 전략이다.이렇게 FetchType.LAZY로 설정하면 Bookmark 객체를 조회할 때 user는 즉시 DB에서 불러.. 2025. 3. 25. 트러블슈팅: 인증과 인가 개요현재 SecurityFilterChain이다. whiteList는 모든 요청을 허용하고, adminList는 ADMIN권한을 가진 사람에게만 허용하고,그 외의 요청은 모두 USER권한이 필요하도록 설정해놓았다. 이러한 권한 검증을 마친 후 filter가 작동되게끔 설계했는데,taskhandler에서 자동으로 작동하는 헬스체크가 실패하고있다. filterChain에서 권한 처리를 다 했는데, 왜 이런 현상이 발생할까? 원인이 문제를 해결하려면 인증과 인가의 차이를 이해해야 한다.인증(Authentication): 사용자의 신원을 검증하는 과정, jwtFilter에서 토큰을 검증하여 사용자를 인증하는 역할 수행인가(Authorization): 인증된 사용자의 권한을 확인하여 리소스 접근을 허용/거부함,.. 2025. 3. 19. Spring Security와 JWT Spring Security를 프로젝트에 적용해보자. 최대한 JWT의 장점을 잘 살릴 수 있는 방법은 무엇일까? JWTJWT가 무엇이고, 어플리케이션이 어떤 구조를 띄고 있을 때 가장 효율적일까?JWT는 무상태 인증 방식으로, 토큰의 Payload에 사용자 정보를 담아 인증을 수행하는 방식이다.클라이언트가 JWT를 요청 헤더 또는 쿠키에 포함하여 서버에 전달하고, 서버는 이를 검증하여 사용자를 인증한다. JWT에는 사용자 정보가 포함되어 있기 때문에, 컨트롤러에서 ArgumentResolver등을 활용하여 DB와 추가적인 통신 없이 사용자 객체를 추출할 수 있다. 이러한 특성 덕분에 JWT는 MSA구조에서 유리하다.각 서비스가 독립적으로 동작하며 인증 상태를 공유할 필요가 없는 구조에서는, 중앙 인증 .. 2025. 3. 18. 최종 프로젝트 KPT 회고 KEEP🥇 기록프로젝트 내내 팀원 모두가 5분 기록 보드, 트러블슈팅/기능구현 문서화를 꼼꼼히 해줘서 마무리가 편했다.팀장으로서 기록하는 분위기를 초반부터 잘 형성했다. 🥈 협업협업이 정말 힘들었지만, 그만큼 보람찼다. 의견 마찰이 있을 땐 최대한 남의 말을 수용하며 내 의견도 피력하려 노력했다.모든 PR에 리뷰어로 참석하여 이해도를 높였고 덕분에 프로젝트 전반을 잘 이끌어 갈 수 있었다.Jira를 이용하여 팀 전체의 일정을 관리하며 성공적으로 프로젝트를 끝마쳤다. 🥉 완성도기술적인 도전을 많이 할 수 있었다. 단순히 도전보단 해당 기술을 사용했을 때 어떻게 고도화, 안정화시킬까를 고민을 많이 했다.팀원들에게는 기능 구현을 맡기고, 팀원들의 구현 로직을 파악하며 어플리케이션의 전반적인 완성도를 높일.. 2025. 3. 17. 사용자가 엔드포인트를 잘못 입력했을 때, 404를 반환시키자! 사용자가 엔드포인트를 잘못 입력했을 경우 500에러를 출력하는 오류가 있다.보통 다른 웹 사이트들은 404 not found를 출력하기도 하고,500에러가 발생한 경우 grafana에서 slack알림을 보내도록 해놨는데이 오류는 서버에 영향을 주는 오류가 아니라서, 이대로 뒀다간 양치기소년이 될것만같았다GlobalExceptionHandler를 통해 엔드포인트를 잘못 입력했을 경우 500에러를 404로 처리해보자. application.yml 수정보통 잘못된 엔드포인트 입력으로 예외가 발생하면, No static resource.. 에러로 처리된다. spring boot는 기본적으로 정적 자원(html, css, js, image)을 제공하기 위해 spring-webmvc모듈로 정적 리소스 매핑을 설정.. 2025. 3. 15. RedisTemplate과의 결합도를 낮춰봅시다 (DIP) DIP란?DIP는 SOLID원칙 중 하나로, 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라 "추상화"된 클래스를 의존하도록 만드는 원칙입니다.스프링에서는 IoC와 DI로 이를 구현할 수 있습니다.DIP를 적용하게 되면, 일반적인 어플리케이션 아키텍처에서 정의하고 있는 패키지 의존성 흐름대로 바꿀 수 있습니다. 예를 들어,현재 우리 서비스의 문제점입니다. Redis를 사용하는 수많은 Application계층의 서비스들이 모두 Infrastructure계층을 바라보며, RedisTemplate에 의존하고 있습니다. 이는 고수준 모듈이 저수준 모듈에 의존하게 되는 것이며 DIP를 위반합니다.이는 유연성을 감소시키고, 테스트를 불편하게 만들며, 모듈 간 결합도가 증가하는 원인이고, 확장성도 떨어지는 설계입니.. 2025. 3. 14. ALB에 Web Application Firewall 적용하기 개요예전에 서버를 열고 얼마 지나지 않은 시점에(한 한 시간 지났었나?) 해커의 공격을 받은 적이 있었다.누군가가 내 사이트로 php기반 공격을 하려했고.. 심지어 맨 뒤에 Hello라고 했다....그때부터 불안에 떨면서 ALB보안그룹에 우리 팀원들 IP만 열어뒀었는데, 늘 이렇게 숨어 살 순(?) 없었다.web application firewall을 적용해서, 어플리케이션을 안전하게 보호해보자! AWS WAF 란?Web Application Firewall은 웹 어플리케이션을 보호하기 위해 HTTP/HTTPS 트래픽을 감시하고, 필터링하는 보안 솔루션이다.네트워크 방화벽과는 달리 어플리케이션 계층(7계층)에서 동작하며, 웹 어플리케이션에 대한 공격을 탐지하고 차단해준다.이를 AWS에서 클라우드 기반으.. 2025. 3. 13. Grafana Alert Rule 설정하기 with Slack 개요현재 어플리케이션의 모니터링-로깅 아키텍처다.모니터링: 프로메테우스로 시계열 데이터를 수집하고, 그라파나로 시각화한다.로깅: fluentd로 logback을 수집하고, elasticsearch로 저장하며, kibana로 시각화한다. 개발자가 하루종일 시각화된 대시보드를 쳐다보고 있을 수는 없다. 자동화된 알림 정책이 필요했고, 우리 팀 슬랙과 연동하게 되었다. New alert rule(슬랙 연동과정은 생략)처음 보게되는 화면인데 굉장히 난해하다. 하지만 promQL을 몰라도 쉽게 적용할 수 있게 제공되어있다.대시보드로 들어가서 내가 확인하고자 하는 값이 어떤 metric인지 확인하자.난 jvm/500에러로 정했다. edit누르면 메트릭 정보를 볼 수 있다http_server_requests_sec.. 2025. 3. 12. Fluentd로 로그를 수집하고, ElasticSearch-Kibana로 시각화하자! 로깅의 필요성EC2서버를 오픈하고 한 가지 문제가 있었다.로그를 보고 싶을 때, ec2내부에 굳이 굳이 들어가서 docker logs app을 입력해야 했고에러가 발생한 지점의 로그만 모아서 보고싶은데 cli창에서 스크롤이 끝도 없이 내려가곤 했다. 내가 맞이한 단순한 문제 말고도 운영 단계에서 로깅은 중요하다.사용자의 요청 처리 과정에서 발생하는 다양한 이벤트와 시스템의 상태를 기록함으로써 시스템의 성능을 분석하고, 비정상적인 접근이나 보안 위협을 감지할 수 있다. 또한 운영단계에선 앞서 내가 겪은 문제점 때문에 디버깅이 힘들다.로깅 툴을 사용한다면, 오류가 발생하면 저장된 로그를 분석해 근본적인 원인을 파악하고 해결할 수 있다. EFK Stack이미 프로젝트에서 elasticsearch, kiban.. 2025. 3. 11. 이전 1 2 3 4 다음