본문 바로가기

분류 전체보기101

파라미터 값을 테스트하는 Mockito ArgumentCaptor ArgumentCaptor는 Mockito 라이브러리에서 제공하는 기능으로, 메서드 호출 시 전달된 인수를 캡처하고 검증하는 데 매우 유용하다. 이를 통해 테스트 중에 메서드가 호출될 때 전달된 인수를 확인할 수 있다.ArgumentCaptor란?ArgumentCaptor는 Mockito 라이브러리에서 제공하는 클래스 중 하나로, 메서드 호출 시 전달된 인수를 캡처하여 나중에 검증할 수 있게 해 준다. 이는 특히 메서드 호출 시 전달된 인수가 예상한 대로 전달되었는지 확인하고자 할 때 유용하다. 예를 들어, 특정 메서드가 호출될 때 전달된 객체의 상태나 값을 검증하고 싶을 때 사용할 수 있다.사용법1. 의존성 추가프로젝트에 Mockito 라이브러리를 추가해야 한다. Maven을 사용하는 경우 pom.xm.. 2024. 10. 1.
XSS 공격 방지를 위한 필수 도구 Jsoup clean 사용법과 예시 웹 애플리케이션을 개발할 때, 보안은 항상 최우선 과제 중 하나이다. 특히, 크로스 사이트 스크립팅(XSS) 공격은 매우 흔한 보안 취약점 중 하나로, 이를 방지하기 위한 적절한 조치가 필요하다. Jsoup은 Java 기반의 HTML 파싱 라이브러리로, HTML 문서에서 데이터를 추출하거나 HTML을 조작하는 데 유용하다. 특히, Jsoup의 clean() 메서드는 HTML 문서에서 악성 스크립트나 불필요한 태그를 제거하여 안전한 HTML을 생성하는 데 사용된다. 해당 포스트에서는 Jsoup의 clean() 메서드 사용법과 Spring 기반 환경에서의 활용 예시에 대해 상세히 설명한다.XSS란 무엇인가?XSS(Cross-Site Scripting)는 공격자가 악성 스크립트를 웹 페이지에 삽입하여 다른 사.. 2024. 9. 24.
Transaction silently rolled back because it has been marked as rollback-only 트랜잭션 처리가 필요한 메서드의 코드에서 Runtime 예외가 발생하고, 그 메서드를 호출하는 메서드에서 해당 부분을 예외 처리를 무시하는 방식으로 넘겼더니 실행 과정에서 "Transaction silently rolled back because it has been marked as rollback-only" 오류가 발생했다. 이 오류는 트랜잭션이 롤백 상태로 표시되어 커밋되지 않고 자동으로 롤백되었음을 의미한다. 이 문제는 주로 트랜잭션 관리와 관련된 설정이나 코드에서 발생할 수 있다. 이 포스트에서는 이 문제의 주요 원인과 해결 방법을 상세히 설명한다. 문제 원인1. 예외 발생트랜잭션 내에서 RuntimeException이나 Error가 발생하면 Spring은 기본적으로 트랜잭션을 롤백한다. 이는 .. 2024. 9. 12.
비동기 환경에서 Spring Security 로그인 정보를 유지시키는 방법 Spring에서는 비동기 처리를 위해 @Async 어노테이션이나 CompletableFuture를 자주 사용한다. 하지만 비동기적으로 실행되는 코드에서는 SecurityContextHolder에 저장된 인증 정보(Authentication)가 기본적으로 전파되지 않기 때문에 보안 컨텍스트를 유지하는 것이 문제가 될 수 있다. 해당 포스트에서는 이 문제를 해결하는 방법을 예제와 함께 설명한다.왜 비동기 환경에서 SecurityContext가 유지되지 않을까?Spring Security는 현재 스레드에 보안 컨텍스트를 저장한다. 하지만 @Async나 CompletableFuture를 사용하면 새로운 스레드가 생성되어 비동기 작업이 수행된다. 이때, 기본적으로 새로운 스레드에는 원래 스레드의 보안 컨텍스트가 .. 2024. 9. 2.
비동기 프로그래밍 @Async와 CompletableFuture 비동기 프로그래밍의 두 가지 접근법비동기 프로그래밍은 현대 애플리케이션에서 성능을 최적화하고 사용자 경험을 향상하기 위해 필수적인 기술이다. Java에서는 비동기 프로그래밍을 지원하는 여러 도구가 있으며, 그중에서도 Spring Framework의 @Async 어노테이션과 Java 표준 라이브러리의 CompletableFuture가 많이 사용된다. 그러면 어떤 경우에 @Async를 사용하고 CompletableFuture를 사용해야 할까? 해당 포스트를 통해 @Async와 CompletableFuture의 차이점과 각각의 사용 사례를 구체적으로 살펴보자. @Async - Spring의 간편한 비동기 처리@Async는 Spring Framework에서 제공하는 어노테이션으로, 메서드를 비동기적으로 실행할 .. 2024. 8. 29.
특정 어노테이션이 추가된 자식 클래스를 찾으려고 할 때, 반드시 @Inherit를 사용하자 @Inherited는 어노테이션이 클래스에 적용될 때 해당 어노테이션이 하위 클래스에 상속될 수 있도록 한다. 기본적으로 어노테이션은 상속되지 않지만, @Inherited를 사용하면 부모 클래스에 적용된 어노테이션이 자식 클래스에도 적용된다. @Inherited 어노테이션이 없는 경우, (1) 인터페이스를 상속받은 구현체 또는 (2) 자식 클래스에서 해당 어노테이션이 추가되어 있는 클래스를 찾을 수 없게 된다. 이를 확인하기 위해 Spring의 ApplicationContext를 사용하여 어노테이션을 찾는 예제로 확인해 본다.1. @Inherited 없는 커스텀 어노테이션 정의@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@interface S.. 2024. 8. 27.
스프링에서 Redis ACL 적용이 안되는 이유 (RedisCommandExecutionException : NOPERM this user has no permissions to run the ...) 😬 상황스프링 애플리케이션에서 웹 소켓 기능을 Redis로 구현한 뒤, Redis에 아무나 접근할 수 없도록 접근 권한을 추가하기 위해 Redis에서 AUTH 명령어로 id, pw 명령어를 계정을 생성하고 권한을 주었다. 하지만 애플리케이션 웹 소켓 Redis pub/sub 과정에서 하기 이미지와 같은 Redis 관련 예외가 발생하며 정상적으로 기능이 작동하지 않았다.원인WAS 서버 OS인 우분투 22.04 LTS에서apt 패키지 관리자를 통해 설치할 수 있는 기본 Redis 버전은 일반적으로 6.0.x 이다. 하지만 Redis Pub/Sub 채널 액세스 관리 ACL은 6.2 이상의 버전부터 지원했다. 그래서 ACL이 정상적으로 적용되지 않은 것이다. 해결WAS 서버의 Redis 버전을 강제로 최신 버.. 2024. 7. 14.
JPA Buddy 플러그인을 이용해서 엔티티에 equals와 hashcode를 명시적으로 구현해야 하는 이유 개발하다 보면 엔티티에 equals, hashcode를 구현하기 위해 Lombok 라이브러리를 활용해 @EqualsAndHashCode를 사용하는 경우가 있다. 하지만 이전 포스팅에서 다뤘던 것처럼 Lazy 연관관계를 갖는 엔티티에서  @EqualsAndHashCode를 사용하면 실제 동등성 비교와 테스트 코드에서 문제가 발생할 수 있다. https://shiba-holic.tistory.com/64 JPA에서 Lombok 사용시 주의할 점🤣 배경 프로젝트를 마치고 나면 항상 코드 인스펙션 과정을 통해 프로그램에 대한 취약점이나 장애가 있는지 확인을 하게 되는데, 간혹 equals와 hashcode가 구현되지 않은 엔티티에 대해 경고로shiba-holic.tistory.com이런 경우, 기본 Lombo.. 2024. 6. 22.