실행 환경 Spring Boot 2.7.1 Gradle 7.4.1 Maven 3.8.5 빌드 시스템 설정 Gradle 더보기 plugins { id 'org.springframework.boot' version '2.7.1' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'org.asciidoctor.jvm.convert' version '3.3.2' // (1) } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } }..
환경 Spring boot 2.7.1 Spring Security JUnit 5 Controller 테스트를 하기위해 불필요한 의존성들은 걷어내고 WebMvcTest 어노테이션을 붙여서 컨트롤러 레이어만 가볍고 빠르게 테스트를 진행할 수 있습니다. WebMvcTest 어노테이션을 붙이게 되면, MVC 테스트를 위한 의존성들이 Spring Contetxt에 올라가게 됩니다. Using this annotation will disable full auto-configuration and instead apply only configuration relevant to MVC tests (i.e. @Controller, @ControllerAdvice, @JsonComponent, Converter/Generi..
회원 도메인에서 Username이 중복이 되면 안되므로 아래 같이 로직을 추가했습니다. Optional account = accountRepository.findByUsername(username); if (account.isPresent()) throw new AccountDuplicateException(username); 하지만 Optional을 반환하지 말고 ifPresent를 사용하면 바로 Exception을 처리할 수 있습니다. accountRepository.findByUsername(username) .ifPresent(a -> { throw new AccountDuplicateException(username) }); 훨씬 더 간결해지고 알아보기 쉬운 코드가 되었습니다. 감사합니다.
Auditing 이란? 엔티티는 나중에 유지보수를 위해서 생성일과 수정일을 필수적으로 가지고 있어야 용이합니다. 먼저 일반적으로 생성일과 수정일을 생성하는 방법입니다. 생성일 public Book saveBook(BookDto bookDto) { // BookDto -> Book 변환 Book book = ...; book.setCreatedAt(LocalDateTime.now()); ... } 수정일 public Long updateBook(Long bookId, BookDto bookDto) { // 수정 로직 book.setModifiedAt(LocalDateTime.now()); ... } 이런식으로 엔티티가 증가하면 증가할수록 단순 반복 코드가 늘어나게 됩니다. 이럴 때 Auditing을 사용하..
JS에서 스코프 관리 아래의 A.js 코드가 있습니다. A.js function sayHello() { console.log("hello"); } .. Hello 콘솔에 출력하는 sayHello라는 함수가 있습니다. 근데 만약 아래의 B.js 라는 파일이 추가가 되면 어떻게 될까요? B.js function sayHello() { console.log("bye"); } HTML 스크립트에 이렇게 선언이 되어있다면? ... 만약 이런식으로 불러오게 된다면, sayHello()는 어떤 값을 출력하게 될까요? 브라우저의 스코프는 공용 공간으로 쓰이기 때문에 마지막에 로딩된 B.js에 있는 sayHello 함수가 A.js의 sayHello 함수를 덮어쓰게 됩니다. 그래서 결국엔 "bye"가 출력이 되는 것이죠...
Spring boot + Security 를 사용하고 있는데 에러 코드 마다 페이지를 보여주고 싶은데 어떻게 해야하는지 방법을 생각해보다가 두가지 방법이 생각났습니다. 1. EntryPoint, Handler 사용 authenticationEntryPoint, accessDeniedHandler에서 사용자에게 해당 에러 페이지로 리다이렉션을 시키는 방법입니다. Security Config /* Security Config */ @Override protected void configure(HttpSecurity http) throws Exception { http // .. .exceptionHandling() .authenticationEntryPoint(new MyAuthenticationEntryP..