본문 바로가기
반응형

개발/Spring71

[Spring Security] Spring Security Login 테스트코드 만들기 요즈음 Spring Boot와 Spring Security를 이용하여 개인프로젝트를 진행중에 있다. 목표는 테스트코드를 작성하자이다. Login은 굉장히 중요한 기능이고 테스트코드가 필수라고 생각했다. 그래서 Spring Security의 Login은 어떤식으로 테스트하는지 공부해보았다. @SpringBootTest class SecurityConfigTest { @Autowired private WebApplicationContext context; @Autowired private MemberRepository memberRepository; @Autowired PasswordEncoder passwordEncoder; private MockMvc mvc; @BeforeEach public void .. 2021. 3. 26.
[Spring Security] Cannot pass a null GrantedAuthority collection 오랜만에 Spring Boot와 Spring Security를 이용하여 간단한 개인 프로젝트를 진행하고 있었다. 코딩할 때 정말 필요한 코드만 작성하는것이 목적이었다. 엔티티를 만들때도 필요한 컬럼만을 작성하기 위하여 아래의 컬럼만 가지고 있었다. @Entity public class Member extends BaseTimeEntity { @Id private String id; private String password; private String name; private Boolean isVerified; } Spring Security를 연동한 후 회원가입이 정상적으로 되는것까지 확인했다. 하지만 정보를 맞게 입력했지만 Login이 되지않는 오류가 나타났다. 로그인에 필요한 UserDetailsS.. 2021. 3. 26.
[Spring] controller unit test with csrf 개인프로젝트를 할 때 테스트케이스를 작성해가며 진행했다. 정상적으로 동작하던 테스트케이스들이 Security를 추가하면서 깨지기 시작했다. 원인을 알아보다 csrf 때문에 그랬다는걸 알게 됐다. Spring Security csrf를 적용하여 controller unit test를 작성하는 법을 알아보겠다. 방법은 굉장히 간단하다. 1. security-test 의존성 추가 org.springframework.security spring-security-test 5.4.5 test 2. MockMvc.perform 부분에 with() 로 csrf 추가 @Test @DisplayName("회원가입 정상 테스트") public void signup() throws Exception { // given Mem.. 2021. 3. 17.
[Spring] @DataJpaTest 사이드 프로젝트를 시작하려고 했다. 사이드 프로젝트의 목표는 아래 두가지 기술 학습이었다. TDD JPA TDD를 적용하려고 했는데 Service 객체의 테스트를 어떻게 해야할지 감이 잡히지 않았다. 최대한 가볍게 테스트케이스를 작성하고 싶었다. @SpringBootTest를 쓴다면 너무 무겁게 되고 @Mock 객체를 사용하자니 실제 DB를 사용하는것과는 환경이 다르다고 생각했다. 개인적인 취향으로는 실제 DB 환경과 비슷한 인메모리 DB를 이용하여 테스트 하는것을 좋아한다. 그러다 @DataJpaTest 어노테이션을 알게됐다. @DataJpaTest는 JPA를 다루는데 필요한 Bean만 가져온다. Mock보다는 무겁겠지만 @SpringBootTest 보다는 가볍다고 생각하여 @DataJpaTest로 진.. 2021. 3. 14.
[Spring] Controller에 파라미터 바인딩은 어떻게 이루어질까 ? 맞춤법 검사를 원하는 단어나 문장을 입력해 주세요. 요즘 개인적으로 Spring Controller를 모방하여 만드는 중이다. Spring의 Controller는 라우팅도 해주지만 개인적으로 제일 편리했던 거는 파라미터 바인딩이었다. 그래서 만들 때 파라미터 바인딩을 나도 해줘야겠다는 생각이 들었다. Method의 Parameter 타입을 검사해서 request 값이랑 대조해서 매칭하면 되겠지만 Spring은 어떤 방식으로 하고 있을까? 궁금하여 분석을 하고자 한다. 1. DispatcherServlet.doService 요청이 들어오면 DispatcherServlet의 doService메소드가 호출된다. doService 메소드 안에서는 doDispatch 메소드가 실행된다. 2. DispatcherS.. 2021. 1. 26.
[Spring] Bean은 어떻게 등록되는 것일까? 요즈음 재미로 Spring의 Controller를 모방하던 도중 Request가 올때마다 new Instance()를 통하여 매번 Class (Controller 객체) 를 생성 해야했다. 너무 비효율적이라고 느꼇고 나중에 BeanFactory도 만들어야겠다는 생각을 가지게됐다. BeanFactory의 동작원리는 알았지만 Spring은 어떻게 효과적으로 관리할까? 라는 의문이 생겨서 소스를 뜯어보았다. 바로 알아보도록 하겠다. 어떤식으로 동작하는지 이해하시기 위해서는 직접 디버깅 해보시는게 제일 좋습니다. 1. Spring Application Run Spring Application을 실행하게 되면 main메소드가 실행되고 SpringApplication.run 을 실행하게 된다. 2. SpringAp.. 2021. 1. 17.
[Spring] Junit5로 예외테스트 하기 JUnit4 에서는 아래와같은 어노테이션으로 예외를 테스트 했습니다. @Test(expected=DuplicateKeyException.class) JUnit5 에서는 예외 테스트의 방법이 달라집니다. 어노테이션에서 아래와같은 메소드를 사용하는 방식으로 변경 되었습니다. 사용법 첫번째 인자로 기대하는 예외 클래스를 줍니다. 두번째 인자로 실행하려는 로직을 줍니다. 예제 @Test @DisplayName("이미 있는 ID로 회원가입시 실패") public void duplication_check_when_signup() throws Exception{ assertThrows(DuplicateKeyException.class, ()-> { Account account = Account.builder() .u.. 2020. 12. 6.
[Spring] PostgreSQL yml 설정 spring boot PostgreSQL yml 설정입니다. spring: datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://url:port/database username: id password: password 2020. 12. 6.
[Spring Batch] Scope 'job' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; Spring Batch에서 @JobScope사용시 아래와 같은 에러가 발생할 수 있다. Scope 'job' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; 기존코드는 아래와 같았다. @JobScope를 빼면 문제없이 동작하는 코드가 @JobScope만 달면 빈 생성에서 에러가 발생했다. @Bean(name = "testJob") public Job testJob(JobCompletionNotificationListener jobCompletionNotificationListener){ return jobBuilderF.. 2020. 11. 16.
[Junit5] org.junit.platform.commons.JUnitException: @BeforeAll method must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS). 요즘 TDD에 관심이 있어서 Junit5를 사용해보려고 한다. 테스트코드전에 실행되어야 하는 로직이 있어서 @BeforeAll을 사용하고자 했다. public class TddTest { @BeforeAll public void memberInit(){ System.out.println("Junit BeforeAll"); } @Test public void memberDomainTest() throws Exception{ System.out.println("TestCode 1"); } } 하지만 아래와 같은 오류가 발생했다. org.junit.platform.commons.JUnitException:@BeforeAll method must be static unless the test class is a.. 2020. 11. 9.
[Junit5] 아직도 @RunWith(SpringRunner.class)를 쓰는가? Junit5가 나온지 어느정도 시간이 흘렀다. 아직도 익숙하다는 이유만으로 Junit4를 사용하는가? "새로 시작하는 프로젝트 혹은 개인프로젝트에서는 Junit5를 사용해보자" 라고 마음 먹었다. 그런데 Test Code를 짜려는순간 @RunWith 가 없어져서 당황했다. 나와같은 개발자들이 있을거라 생각하고 글을적는다. 아래의 @ExtendWith(SpringExtension.class) 는 @RunWith(SpringRunner.class)와 동일하다 2020. 11. 1.
[Spring Boot] spring-data-redis 간단하게 적용해보기 개발환경 window spring boot 2.3.1 spring data redis 2.3.1 commons-pool2 2.8.0 (org.apache) lettuce-core 5.3.1 (io.lettuce) gradle Spring Boot환경에서는 Redis를 적용하기 매우 쉽습니다. 아래의 의존성이 필요합니다. 의존성을 추가한후 Gradle reimport를 해줍니다. 아래와같이 Config파일을 설정해줍니다. @Configuration @EnableRedisRepositories public class RedisConfig { private RedisConnectionFactory redisConnectionFactory; @Autowired public RedisConfig(RedisConn.. 2020. 7. 24.