Restful API는 HTTP 통신을 rest 설계 규칙을 잘 지켜 개발한 API를 Restful한 API라고 한다.
Rest 설계 규칙은 URI는 정보의 자원만 표현해야 하며, 자원의 상태와 행위는 HTTP Method에 명시하는 걸 말한다.
제어 흐름에 대한 주도권이 누구에게, 어디에 있는가에 있다.
프레임워크는 전체적인 흐름을 가지고 있고, 개발자는 그 안에서 라이브러리에 대한 흐름을 가지고 있다.
여기서 개발자의 제어권을 프레임워크에 넘김으로서 신경써야할 것을 줄일 수 있는데 이것을 제어의 역전이라 한다.
Call By Value (값에 의한 호출)
인자로 받은 값을 복사하여 처리하는 방식
장점 - 값을 복사하여 처리하기 때문에 원래의 값이 보존
단점 - 복사하기 때문에 메모리 사용량 증가
Call By Reference (참조에 의한 호출)
인자로 받은 값의 주소를 참조하여 직접 저장해 값에 영향을 주는 방식
장점 - 복사하지 않고 직접 참조하기에 빠르다
단점 - 직접 참조를 하기에 원래의 값이 영향을 받는다
Java에서 어느 부분에 각각 해당하는가?
Java는 기본적으로 모든 전달 방식이 Call By Value
기본형 변수나 참조형 변수 모두 자기 자신이 갖고 있는 값을 복사해 전달하기 때문!
절차지향 프로그래밍
객체지향 프로그래밍
동적 쿼리란 실행시에 특정 조건이나 상황에 따라 쿼리 문장이 변경되어 실행되는 쿼리문
컴파일 시 SQL문장을 확정할 수 없는 경우에 사용한다.
실행 시점에 따라 where 절 조건이 달라질 때 사용한다.
쿼리문이 변하냐 변하지 않느냐에 따라 정적쿼리/동적쿼리가 된다
작은 단위의 테이스 케이스를 작성하고 그에 맞는 코드를 작성하여 테스트를 통과한 후 상황에 맞게 리팩토링하는 테스트 주도 개발 방식을 말한다.
반복적인 단계가 진행되면서 자연스럽게 코드의 버그가 줄어들고 코드는 간결해진다는 장점
TDD는 3가지 과정을 거친다
1. Red - 어떠한 기능을 검증하는 테스트가 실패하는 코드를 작성하고 실제로 실패하는지 확인한다
2. Green - 어떠한 기능을 검증하는 테스트가 통과하는 코드를 작성하고 실제로 성공하는지 확인한다
3. Refactor - 앞에 실패하는 테스트와 성공하는 테스트를 모두 검증했다면 작성한 코드를 깨끗하고 가독성 좋게 고친다.
4. Repeat - 이 세 가지 과정을 반복하여 프로그램을 완성한다
테스트 코드를 작성해야 하는 이유?
1. 프레젠테이션 계층
Domain 클래스와 DTO 클래스를 분리하는 이유?
--> 뷰 계층과 DB 계층의 역할을 분리하기 위해
표현계층 (Presentation layer)
사용자의 요청에 대해 해석하고 응답하는 일을 책임지는 계층 (controller)
client로부터 request를 받고 response를 return하는 API 정의
응용계층 (Application layer)
비즈니스 로직을 정의하고 정상적으로 수행될 수 있도록 도메인 계층과
인프라스트럭처 계층을 연결해주는 역할을 하는 계층 (service)
transaction관리, DTO 변환, 모듈간의 연계를 진행
도메인계층 (Domain layer)
비즈니스 규칙, 정보에 대한 실질적인 도메인에 대한 정보를 가지고 있으며
이 모든 것을 책임지는 계층 (entity)
엔티티를 활용하여 도메인 로직이 진행
업무 상황을 반영하여 상태를 제어하는 역할에 집중하는 계층
인프라스트럭처계층 (Infrastructure layer)
외부와의 통신(ORM, DB, NOSQL)을 담당하는 계층 (Repository)
해당 계층에서 얻어온 정보를 응용 계층 또는 도메인 계층에 전달하는 것을주 역할로 담당
단일 프로그램을 모듈별로 구분하여 작은 서비스의 조합으로 구축하는 방법
모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장
장점
단점
서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다
서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다
서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다
<> Monolithic Architecture : 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 형태
단점