Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Tags more
Archives
Today
Total
관리 메뉴

어? 이게 되네

2022.06.22. 수요일 이공계 전문기술 연수사업 (스프링 시큐리티,스프링 AOP,스프링 인터셉터) 본문

TIL

2022.06.22. 수요일 이공계 전문기술 연수사업 (스프링 시큐리티,스프링 AOP,스프링 인터셉터)

토끼귀에진주귀걸이 2022. 6. 22. 18:57

오늘 배운 것

 

스프링시큐리티를 쓰겠다고 환경설정을 하면 userDetailService를 구현한  클래스의 메소드로 온다 !

스프링 시큐리티를 통할 때는 form태그에 히든 인풋으로 특수한 값을 환경설정 해줘야 하고

아이디에는 username, 비밀번호에는 password라고 name값을 줘야 함!

 

스프링시큐리티에서 로그인한 회원을 상태유지하는 법

어떠한 컨트롤러에서 SecurityContextHolder의 getContext()라는 메소드의 또 메서드 체이닝으로 .getAuthentication()까지 호출하여 authentication객체를 만들고 그 객체에서 로그인한 사용자의 아이디나 사용자넘버 등을 상태유지하거나 세션에 실어줄 수도 있다 !!!!!!!!

 

스프링시큐리티 통해서 아예 세션에 사용자를 등록한다면 굳~~이 join하지 않아도 가능하다는 건가?

 

스프링 di dependency injection

자바로 만들어진 소프트웨어를 들여다보면 수많은 클래스들로 구성됨

클래스들은 has a 관계(멤버-조립-이미 있는 클래스를 가져다가 새로운 무언가를 만들 떄)이거나 is a관계(상속)들로

구성되어 있을 것이다 이것은 서로 클래스들끼리 의존관계에 있다는 뜻 !

때때로 그 의존관계가 강한 의존관계에 있는 클래스들도 있다 !(클래스 안에 다른 클래스의 객체를 선언하거나 등등등...)

그런데 그 강한 의존 관계에 있는 클래스들을 때때로 바꿔야할 일이 빈번함!

유지보수 + 수정 용이성을 증가시키고자 느슨한 의존관계로 만들어야 했고

그것이 DI 개념의 출현이다

의존관계에 있는 객체의 주입을 스프링이 해줌 

어떤 식이냐면 코드 내에서 직접 다른 클래스 객체의 선언보다는 어떠한 환경설정 파일이 있어서

거기에서 객체를 생성하거나 선언하였다.

처음에는 그 객체의 선언을 xml파일에서 bean으로

그러다보니 그 xml이 매우 비대해져서 결국 어노테이션 기반으로 객체가 생성되는 방식으로 바꼈다

그리고 그 의존 관계를 자동으로 설정해주고 객체도 자동으로 설정해주는 방식으로 발전되었다(알아서 스캔되고 알아서 의존관계까지 엮어주는 어노테이션들 - Repository, Autowired, RestController 등등등...)

 

스프링 aop - aspect oriented program(oop를 더 oop답게 해주는 프로그래밍 방식)

di는 어플리케이션이 필요한 객체를 스프링이 알아서 잘 연결해주고 제공해준다는 말이고

aop는 객체가 아닌 메소드에 대한 이야기

 

aop

공통관심사항 잔액조회,대출신청,계좌이체 등등등

핵심관심사항 각각의 공통관심사항의 프로세스들

 

만약에 공통관심사항에 대해 수정요구가 있으면 또 수정하고 호출하기가 번거로움

공통관심사항과 핵심연결사항에 대해 연결,바인딩 등등을 스프링aop가 제공해줌!

 

Advice 공통관심사항을 위해 만들어놓은 클래스들 (그냥 공통관심사항)

JoinPoint 공통관심사항이 호출되는 지점

Pointcut 조인포인트를 묶어놓은 것

Weaving 공통관심사항에 핵심관심사항을 넣어놔 동작하게 하는 것

Aspect 이것들의 객체(환경설정)

 

Advice의 종류

Before Advice 핵심관심사항하기 전에 공통 기능 수행

After Returning Advice 대상 객체의 메서드가 예외 없이 실행한 이후에 기능 실행

After Throwing Advice 대상 객체의 메서드를 실행하는 도중 예외가 발생한 경우 기능 실행

After Advice 핵심관심사항 실행한 후에 공통 기능 수행(에러가 나도 또는 정상적으로 수행해도 둘다 가능)

Around Advice 타깃이 되는 핵심관심사항 실행하기 전에도 그리고 그 후에도 공통기능 수행

 

ProceedingJoinPoint.proceed() 메소드 호출 후 (타깃이 되는 핵심관심사항 실행하는 메소드)

advice가 언제 실행할지 결정함

joinPoint.getSigniture().toShortString()으로 메소드의 이름 가져올 수 있음

메소드 이름이 아이디 역할을 함!

@pointcut 어노테이션으로 핵심 타겟이 되는 메소드들을 설정하는 것임

 

메소드가 수정이 수행될 때 다른 클래스에서 그 메소드의 호출 같은 것에 대해서 유연하게 대처할 수 있어서

생겨난 개념이 aop인듯 

 

joinPoint라는 것은 호출하려는 공통관심사항 하나하나를

그런 것을 여러개 묶어놓은 것을 PointCut이라고 한다(공통관심사항을 특정 규칙으로 여러개 묶어놓은 것)

 

공통관심사항(패키지로 불러오는게 아니라 aspect 어노테이션 써준 애들 아래에서 하는 일)

핵심관심사항(joinPoint로 불러오는 패키지 또는 묶음 아래의 메소드들) 제대로 구별하기 !!!!

 

 

joinPoint에서 묶어온 메소드들 중에 사용자가 실제로 실행한 서비스 특히 그 안의 메소드에 대한

url과 addr을 HttpServletRequest객체를 각 메소드의 매개변수로 만들고 그것을 aspect하는 곳의 weaving하는 곳에다가 배열로 가져와서 해당 url과 addr을 읽는다 !!

joinPoint.getArgs():조인포인트로 묶은 메소드들의 매개변수를 배열로 가져오는 메소드 !(그럼 이건 {(~~,~~,~~),(~~,~~,~~),(~~,~~,~~),(~~,~~,~~)}이런 형식인가..?)

 

Arround Advice일 때는 공통관심사항 메소드에 JoinPoint가 필수로 매개변수로 가져와야함!!!

 

JoinPoint의 메소드

getSignature() 호출되는 메소드의 정보 반환

getTarget() 타겟이 되는 객체를 반환 (패키지 아래에 그게 어떤 객체인지 ! 만약에 controller패키지아래면 어떤 컨트롤러인지)

getArgs() 타겟이 되는 메소드들의 매개변수들을 배열로 가져옴

 

만약에 예외정보가 필요해서

AfterThrowing어드바이스에서 메소드 쓸 때는 반드시 첫 번째 매개변수로 JoinPoint가 와야 하고 두번째로는 그 예외인 Exception이 와야 함!!!!!!

 

스프링의 주요 특)

DI, AOP

 

di:자바로 만들어진 소프트웨어 속을 들여다 보면 수많은 클래스들로 구성되어 있음

클래스들의 의존 관계를 스프링 컨테이너가 제공함으로써 좀 더 느슨하게 설정하여 수정에 대한 요구에 유연하게 대처할 수 있음!

aop:어떤 일처리를 위한 것은 메소드의 형태로 되어있음

이 때, 특정 요청에 따른 핵심관심사항과 공통관심사항이 있음.

공통 관심사항에 대하여 빈번한 수정에 대한 요구를 유연하게 대처하기 위하여 aop를 적용함!

 

이 이미지에 대한 모든 것 기억하고 가기

 

execution의 사용 예 - Pointcut 어노테이션 쓸 때 사용 !

execution(접근명시자 리턴타입 클래스이름 메소드이름(파라미터))

() =>파라미터가 없는 것

(..)=>파라미터가 0개 이상인 모든 것

get*(*) 메소드 이름이 get으로 시작하는 어떤 이름이라도 좋고 매개변수가 1개인것

(Integer,...) 메소드가 적어도 1개이고 첫번째메소드가 무조건 int형 인 것

 

within 명시자

메소드가 아닌 특정 타입에 속하는 메소드를 pointcut(타깃설정)으로 설정할 때 사용하는 것

 

---------------------------------------------------------------------------------------------------------------------------------------------------

필터

웹 어플리케이션에서만, 사용자가 요구한 어떤 요청을 가로채서(예를들어 컨트롤러나 다오로 가지 말고) 먼저 수행하라는 것 그니까 약간 어드바이스처럼 가로채서 먼저 실행하는 것 BeforeAdvice라는 것으로 생각해도 될듯

또 요청을 보내서 가로챌만한 상태면 가로채고 아니면 안하는 흐름제어 역할도 해줌

스프링 시큐리티를 배우기 전에 로그인이나 로그아웃 처리에 대해서 필터처리를 해줘야 했음 !

한마디로 말하자면 웹 어플리케이션에서 사용자의 요청을 가로채어 먼저 동작하여 흐름을 제어하기 위한 용도로 사용하는 것

 

필터를 가지고 인증과 인가가 가능함 !

인증 : 로그인(내가 그냥 사용자인지 아니면 로그인 안한 사람인지 관리자인지 즉 유저가 누구인지 확인하는 절차)

인가 : 따로 역할을 부여해서 역할마다 도메인을 줌!(유저마다 역할에 따라서 권한을 주는 절차)