🔐 스프링 시큐리티를 사용해 회원관리하는 방법을 순서도를 통해 정리해 보세요.
<회원 가입>
1. Client -> Server : 회원가입에 필요한 정보 (username, password, email 등)
2. Server (회원가입 처리)
- 중복 회원 ID 확인
- 패스워드 암호화
- 회원 역할 설정 (USER, ADMIN)
3. Server -> DB : 회원정보 DB 에 저장
< 로그인 >
- Client → Server : 로그인에 필요한 정보 (username, password)
- Server (로그인 처리)
- 회원 DB 에서 username 을 가진 회원정보 가져옴 (회원 정보가 없으면 에러 발생)
- 회원 DB 의 username, password 와 Client 에서 전달받은 username, password 가 동일한지 비교
- Server → Session : 로그인 성공 시 Session 에 저장
- Server → Client : Session 쿠키 전달 (JSESSIONID)
- Client : Session 쿠키 저장
< 로그인 이후 로그인 상태 유지 방법 >
- Client 에서 Server 에 API 요청할때마다 Session 쿠키를 전달
🔐 단위 테스트 코드 작성 시 장/단점을 정리해 보세요.
< 단위 테스트란? >
- 프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다.
- 장점
- 예상 동작과 실제 동작을 비교하여 빠르고 정확한 테스트가 가능하기 때문에 초기 개발의 디버깅이 쉬워집니다.
- 어플리케이션이 변경(기능 확장 또는 리팩터링 등)되더라도 올바르게 작동하는 지 확인할 수 있습니다.
- 단위 테스트 자체를 어플리케이션에 대한 문서로 사용할 수 있다. 특히 잘 만든 테스트 케이스는 API 기능을 쉽게 파악할 수 있도록 도와줍니다.
- 여러 빌드 도구들(maven, gradle 등)은 테스트 자동화 기능을 포함하고 있습니다.
- 단점
- 테스트 코드까지 작성해야하기 때문에 개발 시간이 오래 걸리게 됩니다.
- 어플리케이션 변경 사항을 테스트 코드에도 적용해야 하기 때문에 테스트 코드를 유지보수하는 비용이 든다.
- 장점
🔐 AOP(Aspect Oriented Programming)란 무엇인가?
- AOP는 스프링의 가장 중요한 세 가지 특징인 IoC(제어의 역전), DI(의존성 삽입), AOP(관점 지향 프로그래밍)중 하나. 관점 지향 프로그래밍은 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법.
- 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 본다는 말이고 따라서 관점을 기준으로 각각 모듈화하는 프로그래밍 기법
- 핵심기능 : 각 API 별 수행해야 할 비즈니스 로직 ex) 상품 키워드 검색, 관심상품 등록, 회원 가입, 관심상품에 폴더 추가 등 ....
- 부가기능 : 핵심기능을 보조하는 기능 ex) 데이터베이스 연결, 파일 입출력, 회원 패턴 분석을 위한 로그 기록, API 수행시간 저장 등
- 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
- AOP는 OOP를 대신하는 새로운 개념이 아니라, 기존 OOP를 더욱 보완, 확장하여 OOP를 OOP답게 사용할 수 있도록 도와주는 개념 (OOP(Object-oriented Programming란 객체 지향 프로그래밍)과 나란히 하는, 서로 보완관계에 있는 기술)
🔐 @Transactional이란 무엇인가?
- 여러 작업을 진행하다가 문제가 생겼을 경우 이전 상태로 롤백하기 위해 사용되는 것이 트랜잭션(Transaction) 이다.
- 트랜잭션은 더 이상 쪼갤 수 없는 최소 작업 단위를 의미한다. 그래서 트랜잭션은 commit으로 성공 하거나 rollback으로 실패 이후 취소되어야 한다. 하지만 모든 트랜잭션이 동일한 것은 아니고 속성에 따라 동작 방식을 다르게 해줄 수 있다.
- 위에서 설명한 것과 마찬가지로 트랜잭션의 마무리 작업으로는 크게 2가지가 있다.
- 트랜잭션 커밋: 작업이 마무리 됨
- 트랜잭션 롤백: 작업을 취소하고 이전의 상태로 돌림
- 만약 여러 작업이 모두 마무리 되었다면 트랜잭션 커밋을 통해 작업이 마무리되었음을 알려주어 반영해야 하며, 만약 문제가 생겼다면 작업 취소를 위해 트랜잭션 롤백 처리를 해주어야 한다.
🔐 WAS란 무엇인가? Web Server와 차이점은 무엇인가?
Web Server
- 하드웨어 : Web 서버가 설치되어 있는 컴퓨터
- 소프트웨어 : 웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(.html .jpeg .css 등)를 제공하는 컴퓨터 프로그
- Web Server의 기능 : HTTP 프로토콜을 기반으로 하여 클라이언트(웹 브라우저 또는 웹 크롤러)의 요청을 서비스 하는 기능을 담당한다. 요청에 따라 아래의 두 가지 기능 중 적절하게 선택하여 수행한다.
- 정적인 컨텐츠 제공 : WAS를 거치지 않고 바로 자원을 제공한다.
- 동적인 컨텐츠 제공을 위한 요청 전달 : 클라이언트의 요청(Request)을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답, Response)한다. 클라이언트는 일반적으로 웹 브라우저를 의미한다. Web Server의 예 Ex) Apache Server, Nginx, IIS(Windows 전용 Web 서버) 등
WAS
WAS의 개념
- DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)이다.
- “웹 컨테이너(Web Container)” 혹은 “서블릿 컨테이너(Servlet Container)”라고도 불린다.
- Container란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말한다. 즉, WAS는 JSP, Servlet 구동 환경을 제공한다.
WAS의 역할
- WAS = Web Server + Web Container Web Server 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시되었다.
- 분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용된다.
- 주로 DB 서버와 같이 수행된다.
- 현재는 WAS가 가지고 있는 Web Server도 정적인 컨텐츠를 처리하는 데 있어서 성능상 큰 차이가 없다.
WAS의 주요 기능
- 프로그램 실행 환경과 DB 접속 기능 제공
- 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능
- 업무를 처리하는 비즈니스 로직 수행
- WAS의 예 Ex) Tomcat, JBoss, Jeus, Web Sphere 등
Q1. JPA 연관관계 매핑
- JPA에서 객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것은 매우 중요! JPA의 목적인 객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결이라는 것과 가장 직접적으로 연관되어 있기 때문.
- 연관 관계 매핑은 비즈니스 로직, 비즈니스 요구사항에 따라 개발자가 적절한 관계 설정 방법을 선택해야 함
- 연관 관계 매핑시 고려사항
- 1.방향 : 단방향, 양방향 (객체 참조)
- 2.연관 관계의 주인 : 양방향일 때, 연관 관계에서 관리 주체
- 3.다중성 : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
Q2. 순환참조 정의/이유/해결방법
<순환참조 정의>
- 서로 다른 두 개의 클래스가 서로 참조하고 있는 상태를 말한다.
- JPA 순환 참조는 1:N , N:1, 양방향 관계에서 일어날 수 있다.
<순환참조 이유>
- 스프링에서 DI를 통해 생성자 주입을 할 경우 순환 참조 문제가 발생할 수 있다.
- 생성자 주입은 객체를 생성할 때 주입되기 때문에 객체가 반드시 존재해야 한다.
- A가 B에 의존하고 B가 C에 의존한다면
- A -> B -> C
- 스프링 컨테이너는 C -B - A 순으로 객체를 생성하게 됩니다.
- 그러나 A가 B에 의존하고 B가 A에 의존적이라면 어떠한 객체를 먼저 만들어야 하는지 문제가 생깁니다.
<해결 방법>
@jsonignore (지양함)
- 간단하게 순환참조를 해결할 수 있지만, 연관관계 복잡하게 얽혀있으면 문제가 많음 (사용해야할 떄, 사용하지 못하기도 함)
- 어노테이션이 붙은 객체를 Json 직렬화를 하지 않음
DTO (지향)
- 무한 순환 참조는 객체를 JSON 형태로 변환하는 직렬화 과정에서 발생
- JSON으로 직렬화 할 객체에 연관 관계의 필드를 넣지 않음으로 문제 해결 가능
- 즉, DTO에, 필요한 필드만 만들어서 담아, 순환참조가 일어나지 않도록 하자
Q3. Exception 예외처리를 따로 다루는 이유?
- 웹 어플리케이션에서의 에러를 프론트엔드와 백엔드 모두가 잘 알지 못하면, 서비스하는 환경에서 발생하는 에러에 대해서 제대로 대응 할 수 없습니다.
- 에러를 처리하는 것 역시 관심사를 분리해서 더 효율적으로 처리 할 수 있지 않을까 고민해보는 시간이 필요해서 입니다.
Q4. Spring Security 동작 원리
일반적인 Form Login 절차
1. 요청 수신
- 사용자가 form을 통해 로그인 정보가 담긴 Request를 보낸다.
2. 토큰 생성
- AuthenticationFilter가 요청을 받아서 UsernamePasswordAuthenticationToken토큰(인증용 객체)을 생성
- UsernamePasswordAuthenticationToken은 해당 요청을 처리할 수 있는 Provider을 찾는데 사용
3. AuthenticationFilter로 부터 인증용 객체를 전달 받는다.
- Authentication Manager에게 처리 위임
- Authentication Manager는 List형태로 Provider들을 갖고 있다.
4. Token을 처리할 수 있는 Authentication Provider 선택
- 실제 인증을 할 AuthenticationProvider에게 인증용 객체를 다시 전달한다.
5. 인증 절차
- 인증 절차가 시작되면 AuthenticationProvider 인터페이스가 실행되고 DB에 있는 사용자의 정보와 화면에서 입력한 로그인 정보를 비교
6. UserDetailsService의 loadUserByUsername메소드 수행
- AuthenticationProvider 인터페이스에서는 authenticate() 메소드를 오버라이딩 하게 되는데 이 메소드의 파라미터인 인증용 객체로 화면에서 입력한 로그인 정보를 가져올 수 있다.
7. AuthenticationProvider 인터페이스에서 DB에 있는 사용자의 정보를 가져오려면, UserDetailsService 인터페이스를 사용한다.
8. UserDetailsService 인터페이스는 화면에서 입력한 사용자의 username으로 loadUserByUsername() 메소드를 호출하여 DB에 있는 사용자의 정보를 UserDetails 형으로 가져온다. 만약 사용자가 존재하지 않으면 예외를 던진다. 이렇게 DB에서 가져온 이용자의 정보와 화면에서 입력한 로그인 정보를 비교하게 되고, 일치하면 Authentication 참조를 리턴하고, 일치 하지 않으면 예외를 던진다.
9. 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행한다.(실패시 AuthenticationFailureHandler를 실행한다.)
Q5. TDD란?
TDD란? Test-Driven Development의 약자
- 테스트 코드를 먼저 작성하고 실제 동작하는 코드를 개발하는 순서로 개발하는 개발 방법론
- 설계 → 개발 → 테스트에서
- 설계 → 테스트 → 개발 순서로 하는 것을 말함
Q6. 싱글톤 사용 이유
- 변경되면 안되는 사항 예를 들면 암호화된 비밀번호, 같은 객체가 변하면 안되기 때문에 선언해야한다.
- 스프링 구조 자체가, 스프링 컨테이너에 내부 빈으로 등록하다는 것 자체가 싱글톤으로 등록 된다는 것.
- -> 스프링 컨테이너, 빈을 공부하자
'Coding > Spring' 카테고리의 다른 글
[32] 이번주에 궁금했던 부분 정리 (0) | 2022.12.30 |
---|---|
[31] CORS (0) | 2022.12.18 |
[28] Transaction (0) | 2022.12.14 |
[27] Spring AOP (0) | 2022.12.14 |
[26] OAuth / 소셜 로그인 (0) | 2022.12.14 |