728x90
반응형

코드를 수정하다보면 생기는 여러 문제들

예측하기 어렵다.

 

코드 검증을 자동화할 수 있다면?

 

테스트 test:

프로그램의 품질 검증하는 것. 의도대로 프로그램이 잘 작동하는지 확인하는 과정

테스트 도구를 이용해서 반복적인 검증 절차를 자동화

다양한 문제를 미리 예방하고 코드 변경등으로 인해 발생하는 부작용도 조기에 발견

 

테스트 도구를 활용해 코드를 검증한다 = 테스트 코드를 작성해 실행한다

 

테스트 코드 3단계

1. 예상 데이터 작성하기

2. 실제 데이터 획득하기

3. 예상 데이터와 실제 데이터 비교 검증

 

작성한 코드가 테스트를 통과 하면 지속적인 리팩터링으로 코드 개선

테스트 통과 못하면 잘못된 부분 찾아서 고치는 디버깅 필요

 

테스트 코드는 다양한 경우를 대비해서 작성한다.

테스트 케이스 test case

실패하는 케이스도 필요하다.

 

 

테스트를 통한 코드 검증과 리팩터링은 개발자 필수 소양이다.

 

테스트 주도 개발 또한 개발의 핵심 패러다임

테스트 주도 개발 : TDD : Test Driven Development : 일단 테스트 코드를 만든 후 이를 통과하는 최소한의 코드 부터 시작해 점진적으로 코드를 개선 및 확장

 

테스트 코드 작성하기

 

@Test

해당 메서드가 테스트를 위한 코드라고 선언

 

테스트 코드를 스프링 부트와 연동

ArticleServiceTest 클래스 위에 @SpringBootTest 붙이기

해당 클래스를 스프링 부트와 연동해 통합 테스트 수행하겠다고 선언

 

 

반응형
728x90
반응형

서비스 service

컨트롤러와 리파지토리 사이에 위치하는 계층, 서버의 핵심 기능을 처리하는 순서 총괄

 

클라이언트가 요청을 보내면, 

컨트롤러가 이를 서비스에 전달

서비스는 정해진 규칙에 의해 요청을 가공

가공에 필요한 데이터는 리파지터리가 DB에서 가져온다.

 

트랜잭션

서비스 업무 처리는 트랜잭션 단위로 진행된다. 

트랜잭션이란 모두 성공해야 하는 일련의 과정 의미 , 쪼갤 수 없는 업무 처리의 최소 단위.

 

예약을 잡는데 중간에 실패한다면 앞서 진행한 기록은 모두 취소되어야 한다. 실패한 정보가 남으면 다른 예약을 받을 수 없기 때문.

모두 성공해야 하는 일련의 과정 - 트랜잭션, 트랜잭션 실패시 처음으로 되돌리는 것 = 롤백

 

REST 컨트롤러 코드 : 1인 2역

컨트롤러와 서비스 역할 동시에 수행

 

클라이언트의 요청과 응답을 처리하고 동시에 리파지터리에 데이터를 가져오도록 명령 - 작은 게시판 코드라서

 

일반적인 웹 서비스는 컨트롤러와 리파지토리 사이  서비스 계층을 두어 분업할 수 있게 한다.

 

서비스 계층 만들기

REST 컨트롤러 는 리파지터리 와 협업해서 게시판의 데이터를 CRUD 했다. 여기에 서비스 계층을 추가하여 컨트롤러와 서비스, 리파지터리의 역할을 분업

 

객체 주입된 리파지터리를 서비스로 바꾸기

새 service 클래스를 추가 ArticleService

@Service 어노테이션을 붙이면 스프링 부트에 서비스 객체를 생성한다.

 

서비스에 articleRepository 필드 추가, 객체 주입 @Autowired 

 

원래 ArticleApiController에 구현했던 내용얼 service로 옮겨준다.

컨트롤러는 어떤 URL 요청이 들어왔을 때 뭘 해야하는지에 대한 구현 + HttpStatus 알림을 해주고 실제 역할은

ArticleService에서 하도록 수정

 

 

 

 

---트랜잭션 맛보기

트랜잭션은 반드시 성공해야하는 일련의 과정, 실패하면 롤백

시나리오

1. 게시판에 데이터 3개 한번에 생성 요청

2. 데이터를 DB에 저장하는 과정에서 의도적으로 오류 발생

3. 어떻게 롤백되는지 확인

 

transaction-test URL 을 통해서 한번에 3개의 POST 진행

자바 스트림 문법을 통해 여러개의 JSON 문법 POST가 리스트 형태로 한번에 DB에 추가 될 수 있도록 메소드 추가

 

예외 상황 발생시 실패 메시지를 띄울 수 있도록 예외 처리 추가 (의도적 오류 발생)

 

 

보통 트랜잭션은 서비스에서  관리한다.

서비스의 메서드에 @Transactional 붙이면 해당메서드는 하나의 트랜잭션으로 묶인다.

createArticles 메서드 위에 @Transactional 붙이면 메서드가 중간에 실패하면 롤백으로 이전 상태로 돌아간다.

 

 

 

 

 

반응형
728x90
반응형

클라이언트가 보내는 HTTP 요청 메세지의 첫줄 : 시작라인 = 요청 라인

그 아래 헤더 와 본문

 

응답 메세지 역시 첫줄은 상태 라인, 그 아래 헤더와 본문이 있음

 

요청이 성공하면 200, 데이터 생성 완료하면 201

찾을 수 없으면 404, 서버 오류시 500 

 

REST API 응답 표준으로 사용하는 JSON 은 키와 값의 쌍으로 된 속성으로 데이터 표현

JSON의 value로 배열을 넣을 수도, 다른 JSON 을 넣을 수 도 있음

 

 

REST : HTTP URL로 서버 자원을 명시하고, HTTP 메서드로 해당 자원에 대해 CRUD 하는 것

API : 클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스

 

 

REST API 구현과정

REST API 구현위해 URL을 설계해야 한다.

get,post,patch, delete 를 어떻게 구현할까

 

조회 요청 : /api/articles or /api/articles/{id} : GET 메서드로 Article 목록 전체 혹은 단일 조회

생성 요청 : /api/articles : POST 메서드로 새로운 Article 생성해 목록에 저장

수정 요청 : /api/articles/{id} : PATCH 메서드로 특정 Article 내용 수정

삭제 요청 : /api/articles/{id] : DELETE 메서드로 특정 Article 삭제

 

주소 설계가 끝났다면 URL 요청을 받아 그 결과를 JSON 으로 반환해줄 컨트롤러도 만들어야 한다.

게시판 만들 때는 일반 컨트롤러 ArticleController 사용했지만 REST API 로 응답 주고 받기 위해서는 

REST 컨트롤러 사용, 응답 할 때 적절한 상태 코드를 반환하기 위해 ResponseEntity 라는 클래스도 활용

 

 

JSON 형태가 REST API URL 로 REST 컨트롤러에 요청하면 적절한 상태로 반환하는 ResponseEntity 클래스 응답

 

 

 

REST API 구현하기

기존과 마찬가지로 클래스 파일을 만들지만 클래스 위에 @RestController 붙인다.

 

일반 컨트롤러와 차이

원래는 mustache 파일을 반환하게 되어있었다.

Talend API Tester 에서 테스트 해보면 Body 파트에 HTML 코드가 있음

 

REST 컨트롤러는 JSON or text 데이터를 반환하는 반면 

일반 컨트롤러는 뷰 페이지를 반환한다.

 

REST API : GET 구현

api/articles 에 GET 메서드로 요청

 

새 컨트롤러가 필요

 

ArticleApiController 만들기

 

GET POST PATCH DELETE 구현하기

 

 

POST : 매개변수로 dto만 받아오면 해결되나? 아니다.

REST API 에서 데이터를 생성할 때는 JSON 데이터를 받아와야 하므로 단순히 dto 로 받을 수 있는게 아님

 

dto 매개변수 앞에 @RequestBody 붙이면 

요청시 Body에 실어 보내는 데이터를 create()메서드의 매개변수로 받아올 수 있다.

 

Patch

수정용 엔티티 생성하기

DB에 대상 엔티티가 있는지 확인하기

없거나 수정하려는 id가 잘못됐을 경우 처리하기

대상 엔티티가 있으면 수정 내용으로 업데이트하고 정상 응답(200) 보내기

 

DELETE

삭제하려고 입력 받은 id의 데이터를 찾는다

그 대상이 존재하지 않는다면 bad_Request 알림 띄우고 종료

존재한다면 리파지토리에서 delete 메서드를 이용해서 삭제하고 OK 알림 띄움

 

반응형
728x90
반응형

REST API 와 JSON

웹 브라우저 뿐 만 아니라 다른 기기에서도 정보를 요청하고 응답할 수 있게 하는 REST API 와 JSON 관해 알아보기

 

웹 서비스를 사용하는 클라이언트는 웹 브라우저만 있는게 아님

스마트폰, 스마트 워치 등 각종 기기들(클라이언트) 이 클라이언트의 모든 요청에 응답할 줄 알아야 한다.

 

웹 브라우저 마다도 다르고 기기 마다도 다른 요청이 있고 각각에 맞는 뷰 페이지를 제공해야 한다.

 

REST API : Representational State Transfer API

서버의 자원을 클라이언트에 구애받지 않고 사용할 수 있게 하는 설계 방식

HTTP의 요청에 대한 응답으로 서버의 자원을 반환한다.

이 때 서버에서 보내는 응답이 특정 기기에 종속되지 않도록 모든 기기에서 통용될 수 있는 데이터를 반환해야 

 

서버는 클라이언트의 요청에 대한 응답으로 화면이 아닌 데이터를 전송한다.

이때 사용하는 응답 데이터가 JSON JavaScript Object Notation

 

API : Application Programming Interface : 애플리케이션을 간편히 사용할 수 있게 하는, 미리 정해진 약속

사용자와 프로그램 간 상호 작용을 돕는다. 

 

XML : 사용자 정의형 HTML

JSON : 자바스크립트 방식 차용 객체 표현식

 

JSON 데이터 :

key value 로 구성된 정렬되지 않은 속성의 집합

 

REST API 동작 살펴보기

 

연습용 REST API 서버에 접속해서 HTTP 요청과 응답 실습하기

연습용 REST API 서버 {JSON} Placeholder 사이트

 

Resources 가짜 더미 데이터

게시글 댓글 등등의 자원이 있음

 

POST 메서드를 통해 지정된 URL로 요청을 보내면 게시판에 새 글이 등록되고 새로 생성된 데이터는 json 형태로 반환된다.

 

Talend API Tester

 

http 상태 코드

 

클라이언트가 보낸 요청이 성공했는지, 실패했는지 알려주는 코드

100~500 5개 그룹

1  : 요청이 수신돼 처리 중

2 : 성공

3 : 요청을 완료하려면 추가 행동 필요

4: 클라이언트 요청이 잘못돼 서버가 요청을 수행할 수 없다

5: 서버 내부 에러 발생, 요청에 적절히 수행 불가

 

반응형

+ Recent posts