분류 전체보기 47

HTTPS

HTTP에 보안이 추가된 프로토콜이라고 간략하게 알고 있던 HTTPS에 대해서 조금 더 자세히 정리해보려고 한다. HTTPS(Hyper Text Transfer Protocol Secure Socket layer) HTTP over SSL(TLS), HTTP over Secure라고 불리기도 하는 HTTPS는 HTTP 요청을 SSL이나 TSL이라는 알고리즘을 이용해, HTTP 통신을 하는 과정에서 데이터를 암호화하여 전송하는 방법이다. 암호화를 통해 제 3자가 서버와 클라이언트가 주고받는 데이터를 서로 합의한 방법으로 암호화하여 데이터가 탈취되더라도 내용을 알아볼 수 없도록 한다. HTTPS에서는 클라이언트와 서버가 데이터를 암호화하여 주고받기 위해 대칭키 방식과 비대칭키 방식을 혼용하여 사용한다. 대칭..

BackEnd 2022.11.17

@SpringBootTest, @AutoConfigureMockMvc 사용하여 API Flow 테스트 케이스 작성하기

앞서 주로 비즈니스 클래스의 메서드들이 기능에 맞게 잘 동작하는지 확인하는 테스트인 단위 테스트를 위주로 공부했다. 하지만 API를 개발할 때 주로 Controller, Service, repository로 계층을 나누어 각각의 역할을 수행하도록 구현하기 때문에 각 계층별로 흐름이 잘 연결이 되는지 검증이 필요하다. 이번에는 전체적인 API의 흐름을 테스트하는 테스트 케이스를 작성해보자. 위의 코드는 이메일과 이름, 핸드폰 번호를 입력받아서 회원가입을 진행하는 API에 대한 Controller를 테스트하는 코드이다. 아래에서 하나하나 살펴보자. 먼저 위 코드처럼 테스트를 하기 위해서는 Cson이라는 객체를 Json으로 변환해주는 라이브러리를 추가해주어야 한다. implementation 'com.goog..

JUnit Assertion 대신 Hamcrest를 이용하여 테스트 코드 작성하기

Hamcrest Hamcrest는 JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다. Assertion을 위한 Matcher가 자연스러운 문장으로 이어지므로 가독성이 향상된다. 테스트 실패 메시지를 이해하기 쉽다. 다양한 Matcher를 제공한다. 이러한 이유로 JUnit에서 지원하는 Assertion 메서드보다 많이 사용된다. Hamcrest의 Matcher 이용하기 assertionTest1()은 JUnit의 Assertion을 이용하여 작성한 테스트 코드이다. assertionTest2()는 Hamcrest의 Matchers를 이용하여 작성한 테스트 코드이다. 두 코드 모두 같은 테스트를 하고 있는 테스트이다. 하지만 Assertion을 사용하는 부분에서 차이..

JUnit Assertion 메서드, 테스트 케이스 작성 애너테이션

테스트 케이스 작성에 실제 사용되는 메서드들을 간략하게 정리해본다. JUnit을 사용하지 않고도 테스트 케이스를 작성할 수는 있지만 JUnit을 사용하면 테스트 케이스를 돌리기 위한 main 메서드를 따로 작성하지 않아도 되고, 편리한 검증 api들을 제공해 빠른 테스트 케이스 작성을 가능하게 해준다. JUnit JUnit은 Java로 만들어진 애플리케이션을 테스트하기 위한 오픈 소스 테스트 프레임워크로 가장 많이 사용되고 있는 테스트 프레임워크이다. 스프링부트 또한 JUnit을 디폴트 프레임워크로 채택하고 있다. 스프링부트 프로젝트를 생성하면 아래 dependency가 기본으로 포함되어 있는데, 여기에 JUnit도 포함되기에 별다른 설정 없이 사용할 수 있다. testImplementation 'org..

여러 테스트 방식, 단위테스트의 FIRST 원칙, GWT(given-when-then)

그동안 프로젝트를 하는 동안 따로 테스트 코드를 작성하지 않고 하나의 기능이 완료된 후에 postman을 통해서 api를 실행해보는 방식으로 테스트를 진행해왔다. 이렇게 할 경우, 하나의 기능이 모두 완성된 상태에서 테스트가 진행되기 때문에 만약 에러가 발생한다면 에러가 발생하는 부분을 찾는데 시간이 오래 걸릴 뿐만 아니라 정밀하게 테스트를 하는 데 있어서 한계가 있었다. 그래서 실제 서버를 배포한 후에 에러를 발견해서 고친 적도 여러 번이다. 점점 테스트 케이스를 만들고 테스트 코드를 작성하는 습관을 들여야겠다는 생각을 하게 되어 이번에 테스트 코드를 작성하는 데 있어서 필요한 내용을 간략하게 정리하고 가려고 한다. 여러 테스트 방식 기능 테스트 기능 테스트는 주로 애플리케이션을 사용하는 사용자 입장에..

JDBC, ORM 개념

JDBC(Java Database Connectivity) JDBC는 Java 기반 애플리케이션에서 데이터베이스를 사용할 수 있도록 해주는 표준 사양/명세이다. JDBC API를 사용해 다양한 데이터베이스와 연동할 수 있다. 비록 데이터 액세스 기술의 기본이 되는 저수준 API이기 때문에 직접적으로 사용할 일은 매우 드물다. 스프링은 Spring Data JDBC나 Spring Data JPA 같은 기술을 제공해 더욱 편리하게 데이터 엑세스 로직을 구현할 수 있기 때문이다. 하지만 이러한 기술들도 내부적으로는 JDBC를 이용하기 때문에 알아두면 도움이 된다. JDBC 동작 흐름 Java 애플리케이션에서 JDBC API를 사용하면 JDBC 드라이버를 로딩한 후 데이터베이스와 연결하고 엑세스하는 단순한 구조..

스프링 컨테이너(Spring Container)

스프링 컨테이너(Spring Container) 스프링에서는 스프링 컨테이너를 통해 객체를 관리한다. 그리고 스프링 컨테이너를 통해 관리되는 객체를 빈(Bean)이라고 한다.스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트로 애플리케이션 빈의 생명주기(생성, 관리, 제거)를 담당한다. 스프링 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다. 그리고 스프링 컨테이너를 통해 원하는 만큼의 객체를 가질 수 있다.ApplicationContext를 스프링 컨테이너라고 하며, 다형성을 적용해 인터페이스로 구현되어 있다. 스프링 컨테이너는 XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있다. 스프링 컨테이너가 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리한..

Spring & SpringBoot 2022.10.19

IoC(Inversion of Control) / DI(Dependency Injection)

IoC (Inversion of Control) 애플리케이션의 흐름의 주도권이 뒤바뀐 것을 말한다. 기존에는 개발자가 애플리케이션의 흐름을 제어했다면, 흐름의 주도권을 개발자가 아닌 Spring과 같은 프레임워크에게 넘기는 것이다. 그렇다면 제어의 흐름이란 무엇일까? 쉽게 말해서 개발자가 작성한 코드를 순차적으로 실행하는 것을 말한다. 그럼 흐름의 주도권이 바뀌었다는 말은 개발자가 작성한 코드를 순차적으로 실행하는 것이 아니라 개발자가 아닌 외부에서 코드를 주입해준다고 이해할 수 있다. 다른 예시로 보면 Library의 경우는 애플리케이션의 흐름의 주도권이 개발자에게 있고, Framework는 애플리케이션의 흐름의 주도권이 Framework에 존재한다. 이때 프레임워크에 IoC원칙이 적용된 것이라 이해할..

Spring & SpringBoot 2022.10.19

트랜잭션(Transaction), ACID(원자성, 일관성, 고립성, 지속성)

트랜잭션 (Transaction) 데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위이다. 각 트랜잭션은 해당 트랜잭션에 포함되어 있는 모든 쿼리가 실행이 완료되어야 정상적으로 종료된다. 이 말은 단 하나의 쿼리라도 실패하게 된다면 그 트랜잭션은 실패한 것이다. 트랜잭션은 성공과 실패 두 가지의 결과만을 가진다. 은행을 예로 들어보자. 내가 친구에게 만 원을 송금하려고 한다. 그럼 이 송금에 대한 트랜잭션이 만들어 질 것이고, 해당 트랜잭션 안에는 내 계좌에서 만 원이 출금되는 쿼리와 친구 계좌로 만 원이 입금되는 쿼리가 존재할 것이다. 이 두 개의 쿼리 중 하나의 쿼리라도 실패하게 된다면 데이터베이스에 일관성이 깨지게 된다. 그렇기 때문..

Database 2022.10.05

REST API, URI 설계 규칙, Richardson 성숙도 모델(RMM)

프로젝트를 하면서 Restful한 API를 작성해야지 생각은 하고 항상 점점 지켜지지 않는 경우가 많았다. 아마 확실하게 개념이 잡혀있지 않아서 그런 것 같아 이번에 정리를 해보려고 한다. API란? API는 Application Programming Interface의 약자이다. 여기서 Interface는 서로 상호 간에 영향을 미칠 수 있도록 연결을 해주는 것을 말한다. 그렇다면 프로그래밍 관점에서 말하는 API는 응용프로그램 사이에 데이터나 자원을 주고 받는 방법을 의미한다. 즉, 쉽게 말해서 API는 데이터를 쉽게 주고 받기 위한 양식이라고도 이해할 수 있다. REST API REST라는 형식을 적용한 API를 말한다. REST는 Representatonal State Transfer의 약자로 H..

BackEnd 2022.10.04