본문 바로가기
  • Code Smell

Framework45

[Spring] Spring의 @EventListener Spring의 @EventListener 쓰는 이유? 의존성이 강한 로직들의 레이어를 분리할 수 있습니다. 예를 들어 A 서비스의 a 비즈니스 로직을 실행 할 때 B 서비스의 b 추가 로직을 같이 실행해야 하는 경우 A 서비스에 B 서비스를 주입시켜 a 로직 안에 b 로직을 녹이는 경우가 많습니다. 이렇게 점점 강해지는 결합을 이벤트 핸들러라는 레이어로 분리한 뒤 다시 핸들링 하는 느슨한 결합 형태로 만들 수 있습니다. A 서비스의 a 로직 실행 -> 이벤트 발행 -> B 서비스의 b 로직 실행 이렇게 되면 A 서비스는 B 서비스의 변경사항과 관련없이 수정이 필요없게 됩니다. Spring 4 버전 이상으로 올라오며 쓰기가 많이 편해졌습니다. 기존의 이벤트 객체는 ApplicationEvent 와, 이벤트.. 2021. 4. 21.
[JUnit] JUnit5 사용법과 TDD (2) - REST API 테스트 JUnit5 사용법과 TDD (2) JUnit 5의 dependency 추가 방법과 실행 순서, 기본 annotation에 대한 정리 -> TDD 정리 1 Spring 관련 주요 Test Annotation JUnit5와 spring-boot-test의 모든 annotation은 아니며 자주 사용되는 Annotation만 소개 @ExtendWith(Class[] c) 필요한 Class들을 Configuration 으로 만들어 사용 할 수 있다. (기존 Configuration 클래스도 땡겨 올 수 있다.) Configuration Component이므로 내부에 있는 Bean 까지 등록이 가능하다. Import 된 클래스는 주입으로 사용 가능. @Profile 클래스와 메소드 레벨에서 지정 가능하며, 특정.. 2021. 3. 30.
[JUnit] JUnit5 사용법과 TDD (1) JUnit5 사용법과 TDD (1) 설명 JUnit은 자바의 단위 테스트 프레임워크이다. xUnit에서 파생되어 각 언어별 Unit 프레임워크가 존재한다. C : CUnit C++ : cppUnit Python : pyUnit Java : JUnit 현재 JUnit은 2021년 3월 기준 5버전까지 나온 상태이다. 공식사이트 프로젝트에 추가하기 spring boot 환경(intelliJ, Gradle)에서 추가하였다. JUnit은 spring-boot-starter-test에 기본적으로 포함 되어있다. build.gradle에 spring-boot-starter-test 패키지를 추가하고, 아래 useJUnitPlatform 을 테스트 영역에 작성한다. dependencies { ... implement.. 2021. 3. 19.
[SPRING] 스프링 캐시 사용하기 spring에서 cache 관련 된 기능을 지원한다. 기존 cache 처리라고 하면, Redis, memcached 등의 추가적인 memoryDB를 이용하거나, application 레벨에서 사용 가능한 EhCache 등이 많이 쓰이는데, 이 중 application 레벨에서 사용 가능한 spring cache에 대한 소개이다. spring cache는 cache 기능의 추상화를 지원하는데, EhCache, Couchbase, Redis 등의 추가적인 캐시 저장소와 빠르게 연동하여 bean으로 설정 할 수 있도록 도와준다. 만일 추가적인 캐시 저장소와 연결하지 않는다면, ConcurrentHashMap 기반의 Map 저장소가 자동으로 추가된다. 캐시를 쓰긴 써야하는데, EhCache까지는 쓸 필요는 없고.. 2021. 3. 11.
[SPRING BOOT] REST API 개발하기 5 - Spring Security REST API 개발하기 5 - Spring Security 설정 GitHub 소스 swagger-ui 페이지에 대해 접근 권한을 부여하도록 Spring Security 설정을 한다. Spring Security는 위와 같이 흐름을 타는데 나머지는 Spring Security에 기본으로 구현되어 있는 구현체를 사용하고, WebSecurity를 재정의해서 사용할 수 있는 WebSecurityConfigurerAdapter 클래스를 재정의해서 사용한다. Spring Security는 기본 기능 자체는 막강하지만 실제로 입맛대로 재정의해서 사용해야 하는경우 생각보다 손을 대야하는 부분이 많기 때문에 최대한 기본기능 내에서 사용 할 수 있도록 구현해본다. spring-security 추가를 위한 build.gr.. 2020. 8. 12.
[SPRING BOOT] REST API 개발하기 4 - JUnit 테스트 REST API 개발하기 4 - JUnit 테스트 GitHub 소스 test 패키지에서 사용할 수 있도록 spring-boot-starter-test를 implementation으로 바꿔준다. dependencies { implementation('org.projectlombok:lombok') annotationProcessor('org.projectlombok:lombok') implementation('org.springframework.boot:spring-boot-starter') implementation('org.springframework.boot:spring-boot-starter-web') // swagger2 implementa.. 2020. 8. 5.
[SPRING BOOT] REST API 개발하기 3 - Root 경로 설정 REST API 개발하기 3 - Root 경로 설정 GitHub 소스 root 경로를 입력했을 때 redirect 시킬 수 있다. 예를 들어 http://localhost:8080/ 을 입력하게 되면 아무페이지도 나오지 않던가, tomcat과 같은 WAS를 사용하게 되면 컨테이너의 루트 페이지가 보이게 되는데, 이걸 redirect 시킨다. REST API이니 swagger-ui 페이지로 보일 수 있도록 구성한다. Config 패키지가 있다면 그곳에 설정 클래스를 만들고 WebMvcConfigurer를 구현한다. WebConfig package sunghs.rest.api.config; import org.springframework.context.annotation.Configuration; impor.. 2020. 7. 28.
[SPRING BOOT] REST API 개발하기 2 - ControllerAdvice, ExceptionHandler REST API 개발하기 2 - ControllerAdvice, ExceptionHandler GitHub 소스 ControllerAdvice 및 ExceptionHandler는 클라이언트에서 우리 API로 요청이 들어왔을 때, 에러가 발생한다면 어떻게 핸들링 할지에 대한 처리. 두 어노테이션은 하는 역할은 같지만, scope에 차이가 있는데, ExceptionHandler는 Exception마다 어떻게 처리할지에 대해 메소드 레벨에 선언하는 어노테이션이다. ControllerAdvice는 모든 컨트롤러에서 Exception이 발생한다면 핸들링을 담당할 핸들링 전용 Controller에 선언하는 어노테이션이다. Exception을 처리할 UserControllerAdvice를 만든다. package su.. 2020. 7. 11.
[Gradle] Deprecated Gradle features were used in this build.. Gradle 빌드 시 Deprecated Gradle features were used in this build, making it incompatible with Gradle x.x 일단 이 알림으로 인해 빌드에 실패하는건 아니다. 그냥 알림이다. 빌드에 실패했다면 다른 이유를 찾아 해결해야 한다. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///home/sunghs/project/PacketSniffer2/PacketSniffer/build/reports/tests/te.. 2020. 6. 29.