일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- golang
- ansible
- Proxy
- DevOps
- persistence
- SpyBean
- rest-api
- junit
- AWS
- Packer
- spring
- AOP
- JPA
- HandlerMethodArgumentResolver
- cache
- launch-template
- LocalDateTime
- controlleradvice
- ci/cd
- container
- gocd
- ehcache
- docker
- weaving
- Jpa Auditing
- MockBean
- serializer
- Deserializer
- playbook
- terraform
- Today
- Total
목록Back-End/Java (10)
기록용 블로그
스프링 기반 REST API 개발 백기선님 slideshare 백기선님 study repository 백기선님의 스프링 기반 REST API 개발 세미나 관련 정리. 앞으로 자바 개발을 할 일이 있을진 모르겠지만 REST API와 관련된 HATEOAS나 Self-Descriptive와 같은 개념은 어떤 언어를 사용해 개발하든 적용될 것 같아서 한번 처음부터 진행해봤다. REST API 일반적으로 우리가 REST API라고 하면서 제공하는건 사실 제대로 된 REST API의 형태를 만족하지 않는다. 여러 요건들을 충족해야 하지만 그중에서도 거의 90% 이상이 아래 두가지 요건은 충족하지 못하고 있다. Self-Descriptive HTTP/1.1 200 OK ContentType: application/j..
관점지향 프로그래밍(Aspect Oriented Programming) OOP의 공통 기능(로깅, 트랜잭션, 접근 제어 등의 보안) 등에 대한 횡단 영역의 공통된 부분의 중복을 제거하고 모듈화 하는 프로그래밍의 방식 public List findAll() { //log.info("메소드 내용 실행 전 필요한 로그"); //long start = System.currentTimeMillis(); List bestCategories = bestCategoryRepository.findAll(); //log.info("메소드 내용 실행 완료 후 필요한 로그"); //long end = System.currentTimeMillis(); //log.info("메소드 실행 시간 {}", end -start); re..
JPA를 공부하면 계속 나오는 영속성에 대해서 정리. 엔티티 매니저 JPA의 엔티티 매니저(EntityManager)는 엔티티 저장, 수정, 삭제 조회 등 엔티티와 관련된 모든 일을 처리한다. 엔티티 매니저는 엔티티 매니저 팩토리를 통해 생성되는데, 팩토리는 아래와 같이 생성할 수 있다. 팩토리는 일반적으로 하나의 DB를 사용하는 경우 하나의 Factory만 생성한다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("note"); 엔티티 매니저는 팩토리를 통해 필요할 때 마다 생성할 수 있다. EntityManager em = emf.createEntityManager(); - EntityManagerFactory - 생성 비용이 크..
Jpa Auditing을 통해 엔티티 중복 제거, 자동화하기 JPA 엔티티를 생성하다보면 중복되는 부분들이 많이 발생한다. 등록 시간, 수정 시간, id 등등... 그 외에도 등록 시간과 수정 시간은 엔티티 수정, 생성 시 마다 직접 입력해주어야 한다. 중복되는 부분은 Auditing Entity를 통해 중복을 제거하고 AuditingEntityListener를 통해 생성 시간, 수정 시간, 생성자 정보 등을 자동으로 넣어줄 수 있다. 아래와 같이 id, 생성 시간, 수정 시간, 생성자, 수정자에 대한 정보를 가지는 Superclass의 역할을 할 엔티티를 생성하자. AuditorEntity.java import lombok.Getter; import org.springframework.data.anno..
Spring에서 Java8의 LocalDateTime을 그냥 사용하다보면 왠진 모르겠지만 Serialize, Deserialize 하는 과정에서 많은 문제가 발생한다. 그냥 아래처럼 Custom Serializer, Deserializer 두개를 따로 만들고 활용하는게 더 좋은 것 같다. 원하는 형식에 맞게 Pattern을 지정하고 사용하면 별 에러 없이 사용할 수 있었다. 내가 LocalDateTime을 잘 몰라서 그럴수도 있고.. LocalDateTimeSerializer.java import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import com.fasterxml...
BcryptPasswordEncoder 랜덤값 단위 테스트 작성하기 코드를 작성하면서 회원 정보의 비밀번호 컬럼을 BcryptPasswordEncoder로 암호화해 저장하도록 구현했는데 그 부분과 관련된 단위 테스트를 작성했을 때, 매번 랜덤한 값이 인코딩되어서 나와서 단위 테스트 작성을 어떻게 해야할지에 대해 고민.. Mockito기반 단위 테스트 환경에서 PasswordEncoder를 직접 구현해서 MockPasswordEncoder를 생성한 뒤 @Spy로 주입하고 테스트를 작성했다. 큰 의미를 가지는 테스트는 아닌데 앞으로 랜덤값을 가지는 경우 DI로 주입 될 객체를 바꿔치기 해서 테스트를 하면 될 것 같다. @RunWith(MockitoJUnitRunner.class) public class Me..
@MockBean, @SpyBean 이용 Caching 사용 시 단위 테스트 작성하기 Service단 코드에 EhCache를 적용했었다. 그때 그와 관련된 테스트를 어떻게 진행해야 할 지 고민했었는데 @MockBean과 @SpyBean 어노테이션을 이용해 Repository 코드가 몇번 호출되는지 체크해 단위 테스트를 진행할 수 있었음. Spring Boot 1.4에서 @MockBean과 @SpyBean이 추가됨. @MockBean은 껍데기만 그 객체의 형태를 유지하고, 내부 구현은 사용자가 when, given이나 기타 등등을 통해서 사용자가 직접 정의해주어야 함. @SpyBean을 사용하면 given, when을 한 것 외에 실제 객체를 사용한다. 여기서는 verify를 사용하기 위해 @SpyBean..
Spring Ehcache 적용하기 잘 변경되지 않으면서 반복적으로 호출되는 데이터에 대해 캐싱을 적용해서 서버의 성능을 향상시킬 수 있다. 기본적으로 브라우저(크롬, 익스 등)단에서 캐싱을 적용해주고 있지만 그 이전 단계인 서버에서 캐싱을 적용한다면 DB 조회를 줄이면서 서버의 부하를 조금 더 줄일 수 있다. Spring에서는 spring-starter-cache를 통해 로컬 캐싱을 사용할 수 있는데 기본적으로 ConcurrentHashMap을 사용해 제공하고 있다. 기본 캐시매니저를 사용하지 않고 EhCache를 적용하려면 두가지 의존성을 추가해야 한다. compile('org.springframework.boot:spring-boot-starter-cache') compile group: 'net...
Spring @ControllerAdvice 어노테이션 스프링에서 예외처리를 전역적으로 핸들링하기 위해 @ControllerAdvicde 어노테이션을 사용할 수 있다. 아래와 같이 전역적으로 Exception을 핸들링 할 클래스를 만들고 어떤 에러에 대해서 어떤 방법으로 처리해줄지에 대해 정의해서 사용할 수 있다. @ControllerAdvice public class ControllerExceptionHandler { private static final Logger log = LoggerFactory.getLogger(ControllerExceptionHandler.class); @ExceptionHandler(NoLoginException.class) public String noLoginExcep..
Spring 커스텀 HandlerMethodArgumentResolver 적용하기 HandlerMethodArgumentResolver 인터페이스를 구현해서 커스텀 ArgumentResolver를 만들어보자. Spring Controller단에서 파라미터를 수정하거나 변경하는 경우에 사용한다. 예를 들어, 로그인 사용자의 아이디를 가져온다고 생각해보자. 매번 HttpSession을 파라미터로 받아서 세션에서 유저 정보를 꺼내준다거나 하는 식으로 사용해야 한다. 그런 경우가 한 두번이라면 모를까, 매번 체크해주어야 하는 것이기 때문에 번거롭다. HandlerMethodArgumentResolver는 사용자 요청이 Controller에 도달하기 전에 그 요청의 파라미터들을 수정할 수 있게 해주는 역할을 한다..