반응형

JAVA/JAVA | Spring 학습기록 66

[Spring Security] MockMvc에서 csrfToken을 이용해 403 Forbidden을 해결해보자

스프링 시큐리티를 이용하면 기본적으로 csrf() 옵션이 설정된다. 그렇기 때문에 GET Method를 제외한 POST, DELETE 등이 제대로 실행되지 않고 403 Forbidden 에러를 내뱉을 수 있다. 위 에러는 아래 테스트코드에서 발생했다. 여기서 csrf 공격이란, 간단히 말해서 아래와 같다. 공격자가 임의로 이미지나 하이퍼링크에 자신이 만든 악성링크를 첨부하거나, 이메일로 전송한다. 사용자는 실수로 해당 링크를 클릭한다. 이 때, 사용자는 인증이 완료된 로그인된 상태여야 한다. 공격자는 사용자가 링크를 클릭함으로써 JSESSIONID 등 권한을 탈취하여 마음껏 크래킹할 수 있는 상태가 된다. 이러한 공격을 csrf 공격이라고 한다. 왜 테스트 코드에서 403 Forbidden이 뜬걸까? 먼..

[221231] 유스콘 2022 웨비나 컨퍼런스 후기

올해도 우아한형제들, NEXTSTEP에서 주관하고 유스방 제이슨이 운영하는 유스콘 2022 행사가 개최됐다! 작년에는 아무것도 모르는 상태에서 컨퍼런스에 참여했다면, 올해는 우아한테크코스 과정을 수료하고 지식이 좀 쌓인 상태에서 참여하는 것이라서 더더욱 많은 내용을 이해할 수 있으리라 생각된다. 또, 그만큼 기대되기도 한다 ㅎㅎ 유스콘 2022 행사에 대한 소개는 아래 링크를 참고하자. https://frost-witch-afb.notion.site/YOUTHCON-22-a18e4511463a416e8befd99993355215 YOUTHCON'22 유쾌한 스프링방에서 탄생한 유스콘은 👨‍🎓 젊은 개발자와 👨‍🏫 선배 개발자가 함께 가치 있는 기술에 관한 정보와 경험을 공유하는 콘퍼런스입니다. 여기서 발..

[Spring] 여러 포트에서 동일 애플리케이션 실행하기(Gradle, Maven)

애플리케이션 실행 방법에는 인텔리제이 IDE, 터미널, jar파일 직접 실행과 같이 다양한 방법이 존재한다. 프로세스 여러 개를 띄울 경우, 포트 충돌 이슈를 겪을 수 있기 때문에 random port로 설정해주거나 별도로 포트 세팅을 해줄 수 있다. Spring, IntelliJ 환경에서 어떻게 여러 애플리케이션을 띄울 수 있는지 여러 방법들을 기록해보려 한다. 환경 Spring Boot 2.x IntelliJ(인텔리제이) Gradle 또는 Maven 1. 인텔리제이 edit configurations 에서 application 추가 후 VM options에서 port 변경 위 사진처럼 우측 상단에 보이는 스프링 애플리케이션 실행 부분을 클릭하면 Edit Configurations... 가 보인다. 빨..

[Spring] MapStruct를 이용한 Entity <-> DTO 고찰 (2)

mapstruct는 entity dto를 자동으로 반환해주는 객체 매핑 라이브러리이다. 엄청 옛날에 이런 포스팅을 작성한 적이 있다. (진짜 옛날 글이라 지식이 부족할 때 작성했어서 굳이 열람할 필요는 없다.) https://kth990303.tistory.com/131 [Spring] MapStruct를 이용한 Entity, Dto 반환 및 고찰 그 동안 View layer에서 Entity에 직접적으로 접근하도록 코드를 짰던 나에게, 이번 DTO 적용은 상당히 고된 일이었다. 사실 dto는 단순한 entity의 클론 느낌이라 적용이 크게 어렵지 않을 줄 알았는데, kth990303.tistory.com 사실 위 포스팅은 DTO 반환에 대한 고찰이나 다름 없는 포스팅이었다. 지금 내가 생각하는 DTO의 ..

[Spring] @Configuration vs @Component

스프링은 IoC 컨테이너를 통해 적재적소에 빈 객체를 반환해준다. @Configuration, @Component 어노테이션을 붙여주면 해당 클래스는 스프링 관리 대상이 된다는 점을 보면 크게 차이는 없어보일 수 있다. 어떠한 상황에 @Configuration을 쓰고 어떠한 상황에 @Component를 쓰는 것이 좋을까? 1. @Configuration은 @Component를 포함하고 있다 둘의 차이점을 비교하기 전에, @Configuration이 @Component를 포함하고 있다는 것을 확인하자. 그렇기 때문에 @Configuration 어노테이션이 붙여진 클래스도 @Component 어노테이션이 붙여진 클래스처럼 스프링 컨테이너 관리 대상이다. 참고로 @Component는 아래와 같이 소개돼있다. ..

[Spring] REQUIRED, REQUIRES_NEW 옵션과 Try-Catch

스프링에서 트랜잭션을 다루다보면 두 개 이상의 트랜잭션이 서로 합류하는 경우가 존재한다. 이 때, @Transactional의 전파레벨을 적절히 조정하는 것이 중요하다. 스프링 전파레벨에 대한 이해가 부족하다면 아래 글을 읽고 오는 것을 추천한다. 스프링 @Transactional 전파레벨: https://kth990303.tistory.com/385 @Transactional REQUIRES_NEW 롤백 상황: https://kth990303.tistory.com/387 지난 포스팅(387번)에서는 REQUIRES_NEW 전파레벨 옵션일 때 @TransactionalEventListener를 이용하여 자식이 롤백되더라도 부모가 롤백되지 않도록 설정해주었다. 이번 포스팅에서는 try-catch에 대해 살..

[Spring] REQUIRES_NEW 옵션만으론 자식이 롤백될 때 부모도 롤백된다

두 개 이상의 트랜잭션이 합류할 경우, 트랜잭션 전파레벨 옵션 설정으로 트랜잭션을 관리할 수 있다. 특히, 트랜잭션 전파레벨 중 REQUIRED, REQUIRES_NEW는 실제로도 꽤나 자주 쓰이는 옵션이라 알아두면 더더욱 좋다. 전파레벨 옵션에 대해 궁금하다면 아래 글을 살펴보자. https://kth990303.tistory.com/385 [Spring] @Transactional의 전파 레벨에 대해 알아보자 스프링에선 진행중인 트랜잭션에서 다른 트랜잭션이 참여할 때의 합류조건을 설정할 수 있는 Propagation 옵션이 존재한다. DB에서 자체적으로 제공해주는 트랜잭션 격리레벨과 다르게 전파레벨은 kth990303.tistory.com 이번 포스팅에서는 REQUIRES_NEW 전파레벨 옵션에 대해..

[Spring] @Transactional의 전파 레벨에 대해 알아보자

스프링에선 진행중인 트랜잭션에서 다른 트랜잭션이 참여할 때의 합류조건을 설정할 수 있는 Propagation 옵션이 존재한다. DB에서 자체적으로 제공해주는 트랜잭션 격리레벨과 다르게 전파레벨은 스프링에서 개발자들의 편의를 위해 제공해주는 기능이다. 특히, 트랜잭션 격리 레벨과 마찬가지로 전파레벨은 cs 면접에서 자주 물어보는 주제이기도 하므로 잘 학습해두는 것이 좋을 듯하다. 이번 포스팅에선 트랜잭션 전파 레벨에 대해 작성해보도록 하겠다. 트랜잭션 전파 레벨은 총 7가지 트랜잭션 전파레벨에는 총 7가지 종류가 있다. 스프링 문서에 적혀있는 내용을 바탕으로 한 번 살펴보자. REQUIRED: Support a current transaction, create a new one if none exists...

[Spring] @SpringBootTest의 webEnvironment와 @Transactional

우리는 @SpringBootTest 어노테이션을 이용하여 손쉽게 통합테스트를 진행할 수 있다. 하지만 @SpringBootTest의 webEnvironment 설정에 따라 테스트 격리가 잘 되지 않는 현상을 발견할 수 있다. 왜 그런 것일까? @SpringBootTest의 webEnvironment @SpringBootTest를 파고 들어가면 아래와 같이 webEnvironment 세팅을 볼 수 있다. 기본값은 MOCK이다. WebApplicationContext를 로드하지만, 내장된 서블릿 컨테이너가 아닌 MOCK 서블릿을 제공한다. 실제 서블릿 환경에서 테스트를 진행해보고 싶다면 RANDOM_PORT나 DEFINED_PORT로 진행해주어야 한다. RANDOM_PORT랑 DEFINED_PORT는 위 사..

[Spring] @MockBean VS @SpyBean

Spring Boot 환경에서 여러 협력 객체들이 존재하는 통합테스트는 빈을 호출하기 위해 @SpringBootTest를 사용하는 경우가 많다. 그리고 협력 객체들이 많을 때에는 테스트를 위한 기대 행위 전처리 작업을 mockito를 이용하여 stub을 통해 test double을 만들어주는 경우들이 존재한다. @SpringBootTest와 함께 사용한다면 @Mock, @InjectMocks 대신 @MockBean을 주로 사용할 것이다. 그런데 테스트 코드를 작성하는 방법에 대해 공부하던 도중 @SpyBean이라는 어노테이션을 알게 됐다. 이 어노테이션은 뭐하는 애일까? 그리고 어떻게 사용하는게 좋을까? @MockBean 개인적으로 나는 웬만해선 @MockBean 대신 실제 객체를 사용하는 방식을 사용하..

반응형