본문 바로가기

프로그래밍/Spring

(12)
[Spring] AOP AOP(Aspect Oriented Programming)란 AOP(Aspect Oriented Programming)는 OOP(Object Oriented Programming)에서 발생하는 문제 중 하나인, 관심사의 분리를 해결해주는 프로그래밍 패러다임이다. 관심사의 분리란, 비즈니스 로직 외에 로깅, 보안, 트랜잭션과 같은 부가적인 기능이 필요할 때 이를 모든 메소드마다 일일이 추가하게 되면 코드가 중복되고 유지보수성이 떨어지기 때문에, 부가적인 기능들을 한 곳에서 관리하고 필요한 메소드들에 일괄적으로 적용하는 것을 얘기한다. 위 그림에서 Class A, Class B, Class C는 저마다 부가적인 로직(색깔 블록)이 중복되고 있다. 이때 중복되는 소스코드으로 인해 소스코드가 비대해 질 뿐만 아..
[Spring] @Valid @Validated와 유효성 검사 Annotation @Valid @Validated란 @Valid와 @Validated는 서버 사이드에서 유효성 검사를 하기 위해 자바 및 스프링에서 제공하는 어노테이션이다. @Valid는 javax.validation.constraints 에서 지원하는 어노테이션으로 valid조건들을 검증하고, 유효성 검사에 부합하지 않는 문제 발생 시MethodArgumentNotValidException를 발생시킨다. @Validated는 스프링에서 지원하는 어노테이션 기능으로 @Valid와는 몇가지 차이점이 있다. 먼저, 컨트롤러(핸들러)계층에서만 동작하는 @Valid와는 달리 @Validated는 서비스등 컨트롤러뿐만 아니라 다른 계층에서도 유효성 검사를 할 수 있게끔 해준다. (@Valid는 핸들러 어탭터 처리과정인 Argume..
[Spring] 예외처리 (@ExceptionHandler, @ControllerAdvice) 프로그래밍을 하며 예외처리를 하기 위해서 매번 try-catch를 사용하게 되면 코드가 지저분해지고, 메소드마다 반복적으로 사용하기 때문에 중복, 불편함을 느낄 수 있다. 대신 Spring MVC에서 제공하는 @ExceptionHandler, @ControllerAdvice를 사용하여 일괄적으로 예외처리를 한다면 이러한 불편함을 해결할 수있다. @ExceptionHandler @ExceptionHandler란 @Controller, @RestController 어노테이션이 적용 된 빈에서 발생하는 예외를 캐치하여 하나의 메소드에서 처리할 수 있도록 해주는 어노테이션이다. 즉, 특정 Controller 범위에서 발생하는 예외처리를 전역적으로 처리할 수 있게 해준다. 코드 예제) @Controller pub..
[Spring] (SpringBoot) SQL 로그 남기기 프로젝트를 진행하며, 예상치 않게 오류가 발생하거나 원하지 않은 데이터가 뿌려진 경험이 있다. 이럴 때 마다 문득 내가 작성한 SQL문에 문제가 있는지 로그로 찍어 보고싶어서 log4j2를 이용하여 SQL문과 데이터를 출력하는 작업을 추가하였다. 1. pom.xml에 log4j2 dependency 추가 org.bgee.log4jdbc-log4j2 log4jdbc-log4j2-jdbc4.1 1.16 2. 기존 application.properties 내용 수정 기존 DB 소스코드 #spring.datasource.url: jdbc:mysql://localhost/covid #spring.datasource.username: root #spring.datasource.password: 1234 #sprin..
[Spring] log4j log4j란 log4j는 아파치에서 만든 자바기반의 로그 오픈소스 라이브러리이다. 개발을 하다보면 디버깅을 위해서 System.out.println()을 이용하여 흐름이나 데이터를 출력한 경험이 있을 것이다. 하지만 System.out.println()은 단순히 텍스트만 표시해줄 뿐만 아니라 시스템 성능에도 영향을 미치게된다. 반면 log4j를 사용하게 되면 단순 로그뿐만 아니라 로그 포맷을 통해 에러위치, 출력형식, 출력레벨등을 정의할 수 있기 때문에 로그를 찍는데 여러 방면(성능 부분에서도)에서 더 유리하다고 볼 수 있다. 로그 레벨 log4j는 6개의 로그 레벨을 가지고 있다. 설정파일에서 레벨지정이 가능하고, 그 등급 이상의 로그만 출력할 수 있도록 설정할 수 있다. 예를들어 INFO 등급으로 설..
[Spring] @Transactional @Transactional이란 스프링에서 트랜잭션처리하는 방법 중 하나로, 어노테이션을 활용한 선언적 트랜잭션이라 한다. 여기서 트랜잭션이란 DB의 값을 변경하는 일련의 작업들을 하나의 처리로 묶어 반영(Commit)시키거나 취소(RollBack)시키는 것을 의미한다. 트랜잭션 옵션 1. isolation (격리레벨) - 트랜잭션에서 일관성 없는 데이터 허용 수준을 설정한다. 적용방법 @Transactional(isolation=Isolation.DEFAULT) public void addUser(UserDTO dto) throws Exception { // 로직 구현 } DEFAULT : 기본 격리 수준 = 기본이며, DB의 Isolation Level을 따른다. READ_UNCOMMITED (leve..
[Spring] SpringSecurity 비밀번호 암호화 우리가 프로젝트를 진행하다보면 회원가입기능을 구현할 때가 종종있다. 회원가입을 구현할 때 회원의 정보를 DB에 넣게 되는데, 비밀번호 같은 경우 그대로 DB에 넣게되면 보안에 매우 취약해지기 때문에 비밀번호를 암호화하여 암호화된 패스워드를 DB에 넣을 수 있도록 하여야한다. 비밀번호를 암호화하는 방법에는 여러가지가 있는데, 스프링시큐리티에서 제공하는 BCrpyt를 이용한 비밀번호 암호화에 대해서 알아보고자 한다. 1. pom.xml에 Security 추가 org.springframework.boot spring-boot-starter-security BCrypt기능을 사용하기 위하여 pom.xml에 시큐리티를 추가한다. 다음과 같이 메이븐에 시큐리티를 추가하고 프로젝트를 실행하면 다음과 같은 화면이 뜰 ..
[Spring] 싱글톤 패턴(Singleton pattern) 싱글톤 패턴이란 싱글톤 패턴을 따르는 클래스는 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출 된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글톤 패턴이라고 한다. 즉, 여러 사용자가 매번 객체를 호출할 때마다 객체를 생성하는 것이 아닌 최초에 생성된 객체 하나를 재사용 하는 것을 의미한다. 싱글톤 패턴 사용 이유 같은 클래스의 객체를 만들어 사용하게 될 경우, 매번 새로운 객체를 만들게 되면 메모리의 낭비가 심하기 때문에 이를 방지하고자 사용한다. 예를들어, 순수한 DI 컨테이너 @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig =..