썸네일 Spring Boot에서 Docker로 MySQL 사용하기 백엔드 프로젝트를 할 때 로컬 환경에서 개발하고 테스트할 때 주로 로컬 MySQL DB를 사용했다. 하지만 프로젝트가 많아지거나 테스트할 DB, 테이블이 많아지면 관리하기가 불편하다는 것을 알았고 로컬 환경을 깨끗하게 유지할 필요성을 느꼈다. 먼저 몇 가지 꿀팁을 설명하겠다. 1. PowerShell Ctrl+C / Ctrl+V 단축키 사용하는 법 Windows PowerShell 우클릭 -> 파일 위치 열기 -> Windows PowerShell 우클릭 -> 속성 -> 옵션 -> Ctril+Shift+C/V를 복사(C)/붙여넣기로 사용 체크 2. 이미 존재 하는 컨테이너 이름이라고 뜰 때 docker rm -f 명령어 사용 rm : 컨테이너 삭제 명령어 f: 강제 실행 중지 옵션 사용 중인 포트 확인 ..
썸네일 [Spring] 스프링 AOP AOP (Aspect-Oriented Programming) 관점 지향 프로그래밍 핵심 기능과 부가적인 기능으로 관심사를 분리하여 Aspect로 모듈화 하는 프로그래밍 패러다임 로깅, 트랜잭션 관리, 보안과 같은 공통 관심사(cross-cutting concern)를 캡슐화하는 데 사용된다. AOP 주요 개념 Aspect: 여러 클래스에 걸쳐 있는 공통 관심사의 모듈화 Join point: Advice가 적용될 위치, 메서드 호출 또는 필드 액세스와 같은 프로그램 실행 중 지점 Advice: 조인 포인트에 도달했을 때 실행되는 코드, 실질적인 부가 기능을 담은 구현체 Point cut: 메서드명, 클래스명, 어노테이션등으로 join point를 정의, 스프링에는 @Before, @After, @Aroun..
썸네일 [Spring] Filter, Interceptor, Spring MVC 동작 과정 Filter란? 웹 애플리케이션에서 들어오는 요청과 나가는 응답을 가로채고 수정하는 데 사용됨 DispatcherServlet이 실행되기 전에 실행되며 웹 컨테이너에서 관리됨 Interceptor와는 달리 Request, Response 객체를 수정할 수 있음 (아래 Filter Interface 참고) Java Servlet API의 표준 기능 인증, 로깅, XSS 방어, 이미지 및 데이터 압축, 인코딩/디코딩 요청 및 응답, 스프링과 무관하게 전역적으로 처리해야하는 작업을 처리하는데 사용됨 Interceptor란? DispatcherServlet이 컨트롤러를 호출하기 전/후로 스프링컨 텍스트 내부에서 컨트롤러에 관한 요청과 응답에 대해 처리 스프링 컨텍스트 외부에 존재하는 필터와는 달리 인터셉터는 스..
[Spring] JUnit을 이용한 로그 메시지 테스트코드 Foo.class import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Foo { static final Logger LOGGER = LoggerFactory.getLogger(Foo .class); public void doThat() { logger.info("start"); //... logger.info("finish"); } } FooTest.class import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent..
[Spring] @WebMvcTest 컨트롤러 테스트 @WebMvcTest Mock 환경에서 테스트 할 때 ApplicationContext 전체를 시작하기보다 web layer에만 집중하고 싶을 때 사용 spring MVC 컨트롤러가 예상대로 작동하는지 테스트하는 데 적합 아래와 같은 내용만 스캔하도록 제한다.@Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, WebMvcConfigurer, HandlerMethodArgumentResolver @Component는 스캔 대상에서 제외 자동으로 MockMvc를 생성하여 Mock 테스트 시 필요한 의존성을 제공 공식문서 If you want to focus only on the web layer and not..
[Spring] 회원가입 시 이메일 인증 (feat.네이버메일) naver smtp용 계정 설정 네이버 로그인 -> 메일 -> 좌측 최하단 (용량/환경설정/스킨설정/pop3로그인 기록보기/모바일 메일) 중 환경설정 클릭 -> POP3/IMAP 설정 클릭 -> POP3/SMTP 설정에서 POP3/SMTP: 사용 사용함 적용 범위: 기존에 받은 메일을 포함하여 받음 읽음 표시: POP3로 읽어간 메일을 읽음 표시 원본 저장: 네이버 메일에 원본 저장 외부메일 처리: POP3로 읽어갈 때 외부메일을 포함하지 않음 선택 후 확인 build.gradle implementation 'org.springframework.boot:spring-boot-starter-mail' EmailConfig.java @Configuration @PropertySource("classpath:..
썸네일 [Spring] Global 예외 처리 방법 @ControllerAdvice @Controller 에서 발생한 예외를 한곳에서 잡아 처리해준다. @RestControllerAdvice = @ControllerAdvice + @ResponseBody @ControllerAdvice와 동일한 역할을 하면서 @ResponseBody를 통해 객체를 리턴할 수 있다. @ExceptionHandler @Controller로 선언된 클래스 안에서 발생할 수 있는 에러를 처리해준다. import lombok.Getter; import lombok.Setter; import org.springframework.http.HttpStatus; @Getter @Setter public class RestApiException { private String errorMe..
[Spring] 스프링 주특기 2주차 팀 과제 스프링 프레임워크 1. POJO 기반의 구성 - POJO (Plain Old Java Object) 란 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않고 getter, setter와 같이 가장 순수한 형태의 기본 클래스를 가진 자바 객체를 뜻한다. - 스프링은 POJO기반의 구성을 가지고 있어 자유롭게 객체지향적 설계를 구현할 수 있다. 2. AOP(관점지향 프로그래밍) 지원 - 스프링은 AOP를 통해 반복적인 코드를 줄이고 개발자가 핵심 비즈니스 로직에만 집중할 수 있도록 지원한다. - 공통 기능을 분리함으로써 응집도가 높은 비즈니스 컴포넌트를 만들 수 있고 유지보수 기능을 향상시킨다. 3. IoC(제어의 역행) 적용 - 어플리케이션 수행에 필요한 객체의 생성이나 의존관계를 개발자 대신 IoC를 적..
썸네일 [Spring] IoC, DI, Bean 개념 정리 Ioc (Inversion of Control) Ioc(제어의 역전)은 프로그램에서 필요한 객체를 생성하고 메소드를 호출하는 등의 제어 흐름을 직접 하는 것이 아니라 외부(Spring)에서 관리하는 것을 제어의 역전이라고 한다. Ioc는 라이브러리와 프레임워크의 구분 기준이 될 수 있다. 라이브러리는 해당 라이브러리를 import 하여 함수나 객체를 직접 호출해 사용하여 직접 제어의 흐름을 관리한다. 반면에 프레임워크는 내가 작성한 코드를 실행하여 코드의 제어권이 외부로 넘어간다. DI (Dependency Injection) DI(의존성 주입)은 객체 간 의존 관계가 소스 코드 내부가 아닌 외부의 설정을 통해 정의되는 방식을 뜻한다. 의존하는 클래스를 직접 생성하지 않아 객체 간의 결합도(의존성)를 줄..
썸네일 [JPA] 생성시간/수정시간 필드 추가 import lombok.Getter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.EntityListeners; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.c..