개발자 테스트 코드 작성시 장/단점과 테스트 종류별 특징
왜 테스트를 해야 할까?
- 테스트는 소프트웨어가 예상하지 못한 결과를 내는것, 소스코드나 설계과정에서의 오류로 발생 버그를 잡아줍니다.
- 테스트를 하지 않으면
- 기능이 동작하지 않아 USER 들에게 불편을 주고
- 회사측에서는 매출과 신뢰도 감소
- 개발자는 고생을 하게 됩니다.
=> 버그가 없이 잘 작동하는 코드를 얻기 위해서 테스트는 필요하다.!
장점
- 서버를 실행하는 속도를 줄일 수 있다.
- 필요한 데이터를 미리 기입하고, 테스트가 끝나고 정리하는 등의 행동을 하지 않아도 된다.
- 단위테스트의 경우 빠르게 테스트 할 수 있다.
- 문서로의 역할이 가능하다. ( 프론트나 기획자와 협업이 쉬워진다. )
ex) 초기 값을 1000원으로 했는데 0원으로 변경한다. -> 테스트 코드 수정 및 코드 수정(api)하여 맞춰볼수 있다. - 어떤 값이 들어가서 어떤 값을 반환하는지 나오기 때문에 코드를 처음보는 개발자들의 이해를 도울 수 있다.
- 깔끔한 인터페이스를 얻어낼 수 있다.
- 실수나 오류가 줄어든다 -> 비용 절감!
- 자동으로 테스트 코드가 동작하므로 효율성 올라감!
테스트 코드는...
Given (어떤 값이 주어졌을 때) - 해당 테스트를 하기 위해 필요한 값들
When ( 무엇을 했을 때) - 테스트 하고 싶은 기능
Then ( 어떤 값을 원한다 ) - 테스트 결과
TDD란? 테스트 주도 개발론
프로그램을 개발하기 전에 먼저 테스트 코드를 작성하는 것.
AS-IS) 설계 -> 개발 -> 테스트 (-> 설계수정)
TO-BE) 설계 -> 테스트 (-> 설계수정) -> 개발
" 작성되지 않은 코드를 어떻게 테스트하는 코드를 만드나? " 할 수 있으나 메소드 같은 모듈을 작성 시 작성 종료 조건을 먼저 정해 좋고 코딩하는 정도로 받아들이면 된다.
==> 잘동작하는 깔끔한 코드(Clean Code) : 유지보수의 편의성, 가독성, 안정성 등을 위해..
ex ) 계산기 프로그램
sum() 메서드를 미리 만들고, 정상적으로 개발 되었다는 가정하의 테스트 코드 작성.
public int sum(int a, int b){ return 0; }
Calculator calc = new Calculator();
calc.sum(10,20) == 30 // false
calc.sum(1,2) == 3 // false
calc.sum(0,0) == 0 // true
테스트 종류
테스트 종류 별 처리 비용
단위테스트
프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다.
개발자 테스트
하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트
모듈 간의 상호 작용 검증 못함
단위테스트 특징
F.I.R.S.T
Fast : 가능한 빠르게 실행되어야 한다.
Independent : 객체의 상태, 메소드, 이전 테스트 상태, 다른 메소드의 결과 등에 의존하면 안된다. 어떤 순서로 실행하더라도 성공해야 한다.
Repeatable : 반복 가능해야 한다. (DB에 의존하는 경우, 롤백을 하도록 설정이 필요)
Self-validating : 자체검증이 가능해야 한다. Assert문으로 성공 여부 확인
Timely : 단위테스트를 통과하는 제품코드가 작성되기 바로전에 단위테스트를 작성해야 한다. ( 평소에 TDD를 적용하도록 하자! )
통합테스트
- 두개 이상의 모듈이 연결된 상태를 테스트
- 모듈 간의 연결에서 발생하는 에러 검증 가능
E2E 테스트(End to End Test)
- 실제 사용자의 실행 환경과 거의 동일한 테스트 진행(=블랙박스 테스트)
- 시스템 전체적으로 비즈니스 목표를 충족하는지 확인하는데 집중
- 앱 실행이나 브라우저 테스트 등 (알파테스트)
OAuth2.0 동작 원리
인증을 위한 개방형 표준 프로토콜
용어 정리
Authentication | 인증, 접근 자격이 있는지 검증하는 단계 |
Authorization | 인가, 자원에 접근할 권한을 부여하는 것 인가가 완료되면 리소스 접근 권한이 담긴 Access Token이 클라이언트에게 부여된다. |
Access Token | 리소스를 획득 할 때 사용되는 만료기간이 있는 Token |
Refresh Token | Access Token 만료 시, 이를 갱신하기 위한 용도로 사용하는 Token Access Token 보다 만료 기간이 길다. |
Resource Owner(User) | Resource Server(구글, 페이스북, 카카오...)의 계정을 소유하고 있는 사용자 |
Client (Developer | Company) | Resource Server의 API 서비스를 이용하는 제 3의 서비스 |
Authorization Server | Client의 접근 자격 확인 및 권한을 관리해 주는 서버 (= Resource Server 중 하나) |
Resource Server | OAuth2 서비스를 제공하고, 자원을 관리하는 서버 (= Resource Server 중 하나) |
Obtaining Authorization (권한 취득)
OAuth2 프로토콜에서는 다양한 클라이언트 환경에 적합하도록 권한 부여 방식에 따른 프로토콜을 4가지로 구분하여 제공한다.
1. Authorization Code Grant | 권한 부여 승인 코드 방식
권한 부여 승인을 위해 자체 생성한 Authorization Code를 전달하는 방식 (Default)
2. Implicit Grant | 암묵적 승인 방식
자격증명을 안전하게 저장하기 힘든 클라이언트(스크립트언어를 사용한 브라우저)에게 최적화된 방식
3. Resource Owner Password Credentials Grant | 자원 소유자 자격증명 승인 방식
username, password로 Access Token을 받는 방식
4. Client Credentials Grant | 클라이언트 자격 증명 승인 방식
클라이언트의 자격증명만으로 Access Token을 획득하는 방식
자세한건 여기
권한 부여 승인 코드 방식
회원가입 / 로그인 과정
회원가입 과정
Form Login + Session 과정
- 인증되지 않은 유저가 권한이 필요한 리소스를 요청합니다.
- FilterSecurity Interceptor 가 인증되지 않은 요청에 대하여 AccessDeniedException를 던져 요청을 거부합니다.
- ExceptionTranslationFilter는 인증 시작을 준비하고, 자격증명을 요청하는 AuthenticationEntryPoint를 통해 로그인 페이지로 리다이렉트 시킵니다.
- Client는 로그인 페이지 요청합니다.
- 로그인 페이지를 보여줍니다.
- Filter 는 Http로 요청받은 username과 password를 추출하여 Authentication 타입의 Token 을 만듭니다. Authentication{Token(username, password)}
- Token은 인증을 위해 Manager로 전달됩니다.
- 실패 시
- SecurityContextHolder가 지워지고
- RememberMeService.loginFail이 호출되고(서비스를 사용하는 경우)
- AutheitcationFailureHandler가 호출된다.
- 성공 시
- SessionAuthenticationStrategy는 새 로그인에 대한 알림을 받고
- Authentication은 SecurityContextHolder에 저장되고
- RememberMeServices.loginSuccess가 호출되고 등등..
세션 저장소(메모리)에 과부화가 걸린다. -> 비용증가
서버 확장하는 것이 어렵다 -> 분산된 시스템 설계하기에 매우 복잡
전체적인 과정.. 퍼옴 출처 : https://jungeunlee95.github.io/java/2019/07/17/2-Spring-Security/
security + jwt
JWT Token 생성하기
JWT Token 인증과정
댓글이 달린 게시글 삭제
Board 의 comment 에 아래 설정 걸어주긔
@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)
Rererence
https://velog.io/@tlatldms/Spring-boot-Spring-security-JWT-Redis-mySQL-2%ED%8E%B8
https://velog.io/@shinmj1207/Spring-Spring-Security-JWT-%EB%A1%9C%EA%B7%B8%EC%9D%B8
필터 Filter, SecurityFilterChain이해하기
https://docs.spring.io/spring-security/reference/servlet/authentication/passwords/form.html
Spring boot Swagger 설정(gradle)
swagger3.0 적용시 에러 해결 -> getPatterns()" because "this.condition"is null
https://stackoverflow.com/questions/25967935/jpa-hibernate-spring-onetomany-delete-cascade
'항해99' 카테고리의 다른 글
[WIL] 항해 4주차 (0) | 2022.08.07 |
---|---|
[TIL] 항해 25일차 (0) | 2022.08.05 |
[TIL] 항해 23일차 (0) | 2022.08.04 |
[TIL] 항해 22일차 (0) | 2022.08.02 |
[TIL] 항해 21일차 (0) | 2022.08.01 |
댓글