confing폴더에 securityConfig 생성

securityConfig에 아래와 같은 코드로 passwordEncoder를 Bean으로 추가

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

참고사이트

https://stackoverflow.com/questions/60848619/consider-defining-a-bean-of-type-org-springframework-security-crypto-bcrypt-bcr?rq=1

스프링 부트 실행 시 cannot access MimeMessage와 같은 오류가 떴다.

구글링 후 build.gradle dependices에 다음과 같은 설정 추가

implementation 'org.springframework.boot:spring-boot-starter-mail'

 

참고 사이트 

https://youtrack.jetbrains.com/issue/IDEA-276659

스프링 부트 2.6 이상에서 Querydsl 5.0을 사용하려고 할 때 이전의  build.gradle에서의 Querydsl 설정법을 사용하면 발생하는 오류이다.

 

아래 코드를 build.gradle에 추가해주면 정상적으로 스프링 부트가 실행된다.

 

buildscript {
   ext {
      queryDslVersion = "5.0.0"
   }
}

plugins {
   //querydsl 추가
   id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

dependencies {
   //querydsl 추가
   implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
   implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
}

def querydslDir = "$buildDir/generated/querydsl"

querydsl {
   jpa = true
   querydslSourcesDir = querydslDir
}
sourceSets {
   main.java.srcDir querydslDir
}
compileQuerydsl{
   options.annotationProcessorPath = configurations.querydsl
}
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
   querydsl.extendsFrom compileClasspath
}

Querydsl 사용하는 이유

data jpa의 @Query로는 다양한 조회 기능 사용에 한계가 존재

->해결 하기 위해 정적 타입을 지원하는 가장 유명한 조회 프레임워크 Querydsl 사용

동적 쿼리 작성이 편리

1. build.gradle 수정

 

plugin 블럭에 추가

id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"

dependencies 블럭에 추가

 implementation 'com.querydsl:querydsl-jpa'

querydsl 설정 부분 블럭으로 추가

//querydsl설정

def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
    main.java.srcDir querydslDir
}

configurations {
    querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

2. configuration 추가

이 설정을 통해 jpaQueryFactory를 프로젝트 어느 곳에서나 주입받아 사용 가능

@Configuration
public class QuerydslConfiguration {
    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory(){
        return new JPAQueryFactory(entityManager);
    }

}

 

참고 사이트

https://hello-gg.tistory.com/62

https://jojoldu.tistory.com/372

 

 

 

원래 validate_password_policy 변수의 값 등을 변경하는 방식으로 비밀번호 정책을 바꿀 수 있었다.

my.cnf 파일에 들어가서 해당 변수를 바꾸려고 하거나

mySQL을 실행한 후 mysql> SET GLOBAL validate_password_policy=LOW;을 실행해 바꾸려고해도 

Unknown system variable 'validate_password_policy'라는 오류가 떴다.

 

1. SHOW VARIABLES LIKE 'validate_password%'; 로 시스템 변수명 확인

mySQL 버전이 업그레이드 되면서 새로운 방법으로 비밀번호 정책을 변경해야하는 게 아닌가 생각이 들던 중 

SHOW VARIABLES LIKE 'validate_password%';

위 코드를 통해 비밀번호 유효성 검사 시스템 변수들을 확인할 수 있다는 사실을 알았다. 

 

해당 명령어를 통해 비밀번호 정책 관련 시스템 변수들을 확인해보니 validate_password_policy에서 validate_password.policy로 변수명이 바껴있었고 validate_password_length 변수도 validate_password.length로 변수명이 바껴있었다. 이밖에도 관련 다른 변수명들을 해당 명령어를 통해 확인할 수 있다.

 

2. 바뀐 변수명에 맞춰 비밀번호 정책 바꿔주기

SET GLOBAL validate_password.policy=LOW;

 

SET GLOBAL validate_password.length=4;

 

3. 확인해보기

SHOW VARIABLES LIKE 'validate_password%'; 

정상적으로 변경됐음을 확인할 수 있다.

 

참고 사이트

https://scbyun.com/1137

AOP (Aspect-Orientes Programming)란?

관점 지향 프로그래밍

AOP는 OOP(객체지향프로그래밍)와 다른 게 아니라 OOP를 보완해주는 것

OOP에서 핵심 비즈니스 로직과 독립적으로 분리하기 힘든 부가 기능들을 AOP의 Aspect을 활용해 모듈화해준다.

핵심 비즈니스 로직을 담고 있지는 않지만 어플리케이션에 부가됨으로써 의미를 갖는 특별한 모듈!

 

OOP: 비지니스 로직의 모듈화

AOP: 인프라 혹은 부가 기능의 모듈화

  ex) 트랜잭션, 로깅, 등

 

Aspect을 이용해 모듈화 왜 필요? 그냥 쓰면 안되나?

흩어진 관심사를 횡단 기능에 관심을 두어 하나로 합칠 수 있다.

이 과정에서 중복을 줄여 코드의 효율성도 증가하고 유지보수도 더 쉬움

ex)

매 클래스마다 이용자가 사용하는 부가 기능(ex, 실행시간 측정 등)이 있다고 생각해보자.

관련된 코드들을 매 클래스마다 다 넣으면 핵심 로직과 관련된 코드도 아닌데 작성도 힘들고 수정이 필요할 시 유지보수도 힘들다.

그렇다고 없앨 수는 없다.

 

AOP 용어

Aspect

부가 기능 모듈

advice와 point cut을 내재

Target

aspect에 적용되는 대상

Advice

어떤 기능을 부가적으로 넣을지

Join Point

advice 적용될 위치, 끼어들 수 있는 지점, 메서드 진입 지점, 생성자 호출 지점 등 다양한 시점에 적용 가능

Point Cut

어디에 적용해야 하는지에 대한 정보 ex 메서드 정보 등

Proxy

타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑 오브젝트

Weaving

지정된 객체에 aspect를 적용해서 새로운 proxy 객체를 생성하는 과정

 

AOP 구현체 종류

1. AspectJ

2. Spring AOP

 

AOP 적용 방법

1. 컴파일시 -> AspectJ

자바 파일을 클래스 파일로 만들 때 바이트 코드를 조작하여 AOP 적용

2. 클래스 로드시 -> AspectJ

컴파일은 원래 클래스 그대로, 클래스를 로딩하는 시점에 AOP 적용

3. 런타임시(프록시 패턴 사용) -> Spring AOP

Spring AOP 대상인 클래스의 빈이 만들어질 때 Spring AOP가 프록시 기능이 추가된 클래스를 자동으로 만든다.

이후 원본이 아닌 프록시 기능이 추가된 클래스를 빈으로 등록

Spring AOP란?

스프링은 프록시 패턴을 이용해 AOP를 구현

스프링 빈에만 AOP 적용 가능

모든 AOP 기능을 지원하진 않고 스프링 IoC와 연동하여 중복코드, 프록시 클래스 작성 번거로움과 같은 흔한 문제들에 대한 해결책을 지원하는 게 목적

 

Spring AOP 의존성 추가

 

maven

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-aop</artifactId>

</dependency>

gradle

implementation 'org.springframework.boot:spring-boot-starter-aop'

 

참고 사이트

https://www.youtube.com/watch?v=Hm0w_9ngDpM 

https://jojoldu.tistory.com/71

https://devlog-wjdrbs96.tistory.com/398

https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-AOP-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4-%EB%B0%8F-%EC%A0%81%EC%9A%A9-%EB%B0%A9%EB%B2%95

https://engkimbs.tistory.com/746

https://tecoble.techcourse.co.kr/post/2021-06-25-aop-transaction/

 

 

 

 

 

 

 

+ Recent posts