본문 바로가기
반응형

개발127

[Spring] @ContextConfiguration with Kotlin 기존에 @ContextConfiguration를 이용할 때는 아래와 같이 이용하였다. @ContextConfiguration(classes = {A.class, B.class}) 하지만 Kotlin 을 이용하여 위와 같이 작성하려고 하니 계속 에러가 났다 조금 찾아보니 Kotlin에서는 아래와같이 입력을 해야한다고 한다. @ContextConfiguration(classes = [DemoRouter::class, DemoHandler::class]) 2021. 4. 29.
[Spring data mongodb] 몽고DB에서 시퀀스를 이용하기 Sequence로 이용할 Document를 하나 정의한다.@Document class DatabaseSequence( @field:Id var id: String, var seq: Long ) { } Sequence를 생성하는 Creator를 정의한다.@Component class SequenceCreator( private var mongoTemplate: MongoTemplate ) { fun create(sequenceName: String): Long { val counter: DatabaseSequence = mongoTemplate.findAndModify( query(where("_id").`is`(sequenceName)), Update().inc("seq", 1), options().re.. 2021. 4. 29.
[Querydsl] SemanticException: right-hand operand of a binary operator was null Querydsl을 이용하여 아래와 같은 구문을 작성하였다. 실행 결과 SemanticException: right-hand operand of a binary operator was null 라는 오류를 만났고 30분~1시간 정도를 헤맸다. queryFactory .select(Projections.constructor(ProjectInfo.class , qProject.id, qProject.title, qProject.explain )) .from(qProject) .innerJoin(qProjectParticipants) .on(qProject.id.eq(qProjectParticipants.projectParticipantsId.project.id)) .where(qProjectParticipan.. 2021. 4. 12.
[Spring] @TestConfiguration Controller 테스트할 때 @SpringBootTest 보다는 @WebMvcTest 를 사용하면 조금 더 가벼운 테스트를 할 수 있다. 하지만 @WebMvcTest 는 @Component @Service @Repository 는 Scan 하지 않는다. 즉, 빈으로 등록되지 않는다는 것이다. 그렇기 때문에 Controller 테스트를 할 때 빈 등록이 안된다고 오류가 나거나 빈이 null 로 나오는 상황을 마주칠 수 있다. 이럴 때 사용할 수 있는 어노테이션이 @TestConfiguration 이다. 테스트 환경에서 필요한 빈들을 등록할 수 있도록 도와주는 어노테이션이다. 사용방법을 알아보도록 하겠다. 아래와같이 TestConfig.class 를 만들고 @TestConfiguration 어노테이션을 .. 2021. 4. 9.
[Spring Security] @WebMvcTest Error creating bean with name 'securityConfig' defined 필자의 사이드프로젝트에 Spring Security가 적용되어 있었다. Spring Security의 구조를 리팩토링 한 후에 테스트 케이스를 돌려보았는데 @WebMvcTest 가 붙어있는 테스트케이스들이 깨지기 시작하였다. SecurityConfig 를 생성하지 못한다는 에러를 뿜었다. 이번 리팩토링에서 변화한 것은 필드가 추가되었고 그에따른 생성자가 추가되었다는 것이다. @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { private final LoginAuthenticationProvider loginAuthenticationProvider; private final J.. 2021. 4. 5.
[Spring Security] Login 이 성공했을 때 후처리를 어떻게 할 수 있을까? Spring Security를 쓰면 Login이 손쉽게 구현할 수 있다. 하지만 우리는 Login이 성공했을 때 추가로 작업을 해줘야 하는 상황들이 많이 있다. 대표적인 예가 토큰을 발급해서 내려준다든지 쿠키나 헤더에 어떠한 값들을 세팅을 해줘야 할 때가 종종 있다. 어떻게 할 수 있는지 알아보도록 하겠다. 방법은 매우 간단하다. Spring Security에 존재하는 AuthenticationSuccessHandler 인터페이스를 구현하기만 하면 된다. AuthenticationSuccessHandler 은 총 2개의 메소드로 이루어져 있고 그 중 하나는 default 메소드이다. 이 인터페이스를 구현한 Handler 클래스를 하나 생성한다. public class LoginAuthHandler imp.. 2021. 4. 3.
[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.
Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-200] Mybatis, JUnit, H2를 이용하여 예제파일을 만들다가 Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-200] 이런 오류를 만났다. 원인은 포트가 중복으로 떳다는 것이고 이미 실행중인 포트를 죽이면 해결된다고 한다. h2 실행을 중지시키고 다시 test하니 정상적으로 실행됐다. 2021. 3. 7.
[JAVA] PriorityQueue 란? 필자는 코딩테스트를 볼 때 우선순위를 구해야 할 때 굉장히 손쉽게 구할 수 있다는 장점이 있어서 자주 사용하였다. 하지만 "어떻게 동작하는지 설명 해주실 수 있나요?" 라는 질문에 머리를 한대 맞은 느낌이었다. 내가 원리를 제대로 알고 사용하지 않았구나 하고 반성을 했으며 공부 해보았다. PriorityQueue란? 우선 순위 힙을 기반으로하는 제한되지 않은 우선 순위 큐이다. 출처 : docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html 우선순위 큐란 들어가는 순서에 상관없이 우선순위가 높은순서대로 나오는 큐를 뜻한다. PriorityQueue (Java Platform SE 7 ) An unbounded priority queue based .. 2021. 2. 22.