본문 바로가기
항해99

[TIL] 항해 24일차

by yeaseul912 2022. 8. 4.
728x90
개발자 테스트 코드 작성시 장/단점과 테스트 종류별 특징

왜 테스트를 해야 할까?

  • 테스트는 소프트웨어가 예상하지 못한 결과를 내는것, 소스코드나 설계과정에서의 오류로 발생 버그를 잡아줍니다.
  • 테스트를 하지 않으면
    • 기능이 동작하지 않아 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을 획득하는 방식

 

자세한건 여기

권한 부여 승인 코드 방식

출처 : https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

회원가입 / 로그인 과정

회원가입 과정

Form Login + Session 과정

  1. 인증되지 않은 유저가 권한이 필요한 리소스를 요청합니다.
  2. FilterSecurity Interceptor 가 인증되지 않은 요청에 대하여  AccessDeniedException를 던져 요청을 거부합니다.
  3. ExceptionTranslationFilter는 인증 시작을 준비하고, 자격증명을 요청하는 AuthenticationEntryPoint를 통해 로그인 페이지로 리다이렉트 시킵니다.
  4. Client는 로그인 페이지 요청합니다.
  5. 로그인 페이지를 보여줍니다.

  1. Filter 는 Http로 요청받은 username과 password를 추출하여 Authentication 타입의 Token 을 만듭니다.  Authentication{Token(username, password)}
  2. Token은 인증을 위해 Manager로 전달됩니다.
  3. 실패 시
    •  SecurityContextHolder가 지워지고
    • RememberMeService.loginFail이 호출되고(서비스를 사용하는 경우)
    • AutheitcationFailureHandler가 호출된다.
  4. 성공 시
    • SessionAuthenticationStrategy는 새 로그인에 대한 알림을 받고
    • Authentication은 SecurityContextHolder에 저장되고
    • RememberMeServices.loginSuccess가 호출되고 등등..

세션 저장소(메모리)에 과부화가 걸린다. -> 비용증가

서버 확장하는 것이 어렵다 -> 분산된 시스템 설계하기에 매우 복잡

 

전체적인 과정.. 퍼옴 출처 : https://jungeunlee95.github.io/java/2019/07/17/2-Spring-Security/

 security + jwt 

출처 : https://velog.io/@ehdrms2034/Spring-Security-JWT-Redis%EB%A5%BC-%ED%86%B5%ED%95%9C-%ED%9A%8C%EC%9B%90%EC%9D%B8%EC%A6%9D%ED%97%88%EA%B0%80-%EA%B5%AC%ED%98%84

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

JWT-토큰-인증

필터 Filter, SecurityFilterChain이해하기

https://docs.spring.io/spring-security/reference/servlet/authentication/passwords/form.html

OAuth 2.0동작 방식의 이해

Spring Boot Swagger 3.x 적용

Spring boot Swagger 설정(gradle)

swagger3.0 적용시 에러 해결 -> getPatterns()" because "this.condition"is null

https://stackoverflow.com/questions/25967935/jpa-hibernate-spring-onetomany-delete-cascade

Test-TDD(테스트 주도 개발방법론) 이란?

반응형

'항해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

댓글