TDD

테스트 주도 개발(Test Driven Development) 또는 테스트 우선 개발(Test First Development)이란, 특정 기능을 테스트하기 위한 테스트 코드를 먼저 작성한 후에 그 테스트를 통과시키기 위해 실제 기능을 개발하는 개발 방법을 말한다. TDD에서는 이렇게 테스트 코드를 만들고 테스트를 통과시키는 짧은 주기의 사이클을 계속해서 반복하며 프로그램을 완성시켜 나간다. 이 주기는 세가지 단계로 나누어진다.

 

RED : 실패하는 테스트 코드를 작성한다.

GREEN : 테스트가 성공하도록 실제 기능을 구현한다. 

BLUE : 구현한 코드를 리팩토링한다.

 

 

(1) 테스트 코드 작성 

 제일 첫번째 단계에서는 실패하는 테스트 코드를 작성한다. 현재 구현하고자 하는 기능에 대한 단위 테스트(Unit Test)를 작성하는 것이다. 아직 기능을 구현하지 않았으니 당연히 실패한다.

 - 어떤 입력이 들어올 예정인지

 - 그 때 어떤 함수가 호출되는지

 - 그러면 어떤 결과가 나와야 하는지

 

(2) 기능 구현

 테스트코드가 작성되었으면 다음은 그 코드가 통과되도록 기능을 구현한다. 

 - 호출된 함수의 내부 작성

 

(3) 리팩토링

 테스트가 통과되었으면 마지막으로, 구현한 코드를 깔끔하게 정리한다. 중복된 코드를 함수로 추출하거나, 더 좋은 형태로 수정한다. 이 과정을 리팩토링이라고 한다. 리팩토링이 완료되면 테스트를 한번 더 수행하여 여전히 통과되는지 확인한다. 

 

 

 

왜 하는가

코드에 대한 확신을 가질 수 있다.

 이런 식으로 테스트를 먼저 작성해두면, 나중에 기능의 변경이나 추가가 있을 때 새로 작성한 코드가 기존의 기능을 건드리지 않고 안정적으로 동작하는지 테스트 한번에 확인할 수 있다. 또한 매번 테스트가 성공하는 것을 보면서 작성한 코드에 대한 확신을 가질 수 있어 가벼운 마음으로 다음 단계로 넘어갈 수 있다. 

 

빠짐 없이 테스트 할 수 있다.

 TDD의 기본 원칙은 "실패한 테스트를 성공시키기 위한 목적이 아닌 코드는 만들지 않는다"는 것이다. 따라서, 이 원칙을 잘 따랐다면 만들어진 모든 코드는 빠짐없이 테스트로 검증된 것이라고 볼 수 있다. 개발을 먼저 하고 미루고 미루다 테스트 코드를 작성한다면 성의 없는 테스트를 하거나 몇몇 기능은 테스트를 아예 빼먹을 수도 있다. TDD 방식으로 개발한다면 테스트를 빼먹지 않고 꼼꼼하게 만들 수 있다! 

 

전체적인 개발 속도가 빨라진다.

 누군가는 매번 테스트코드를 작성하면 전체적인 개발 일정이 지연되지 않을까 생각할지도 모르겠다. 하지만 테스트 코드를 작성하는것은 실제 기능을 구현하는것보다 상대적으로 간단하기때문에 생각보다 시간이 오래 걸리지 않는다. 오히려 테스트 덕분에 오류를 빨리 잡아낼 수 있기 때문에 전체적인 개발 속도는 빨라진다. 반대로 테스트가 없다면, 개발자는 프로그램을 일일히 실행시켜 보면서 어느 부분에서 오류가 발생하는지 확인해봐야 할 것이다.

 

기능설계와 테스트

 테스트 코드를 작성하는것은 결국 '어떤 기능이 필요한지'를 정의하는것과 비슷하다. 즉, 추가하고 싶은 기능을 테스트 코드로 표현하는 것이다. 이렇게 작성된 테스트들은 잘 작성된 기능정의서처럼 볼 수 있다. 테스트코드를 작성하는것으로 기능설계와 테스트라는 두가지 작업을 동시에 끝내는 것이다.  

 

 

 

 

어떻게 하는가 - 테스트 코드는 어떻게 작성하는가 

 그러면 테스트 코드는 어떤식으로 작성해야 할까? 예를 들어, DB에 접속하여 신규 사용자 데이터를 추가하는 MyDBConnection class에 대한 테스트를 작성한다고 생각 해 보자. 

 

 

기능적으로 어떤 회원 정보를 입력하면 DB에 해당 데이터가 저장되고, 똑같은 정보로 DB를 조회했을 때 동일한 회원 정보가 조회되어야 한다. 이를 코드로 표현하면 다음과 같다. 

public class UnitTest {
	public static void main(String[] args) throws SQLException {
    	
        //테스트할 DB 인터페이스 객체라고 가정
        MyDBConnection db = new MyDBConnection();
        
        User user = new User();
        user.setEmail("hong@example.com");
        user.setName("홍길동");
        user.setAge(20);
        
        db.add(user);
        
        System.out.println(user.getEmail() + "등록 성공");
        
        User user2 = db.get(user.getEmail());
        System.out.println(user2.getName());
        System.out.println(user2.getAge());
        
        System.out.println(user2.getEmail() + "조회 성공");
	}
}

 

그런데, 이 테스트 코드엔 몇가지 문제가 있다. 

(1) 먼저, 조회한 데이터가 입력한 데이터와 같은지 확인해주지 않고 화면에 출력하여 개발자가 눈으로 직접 확인해야 한다.

(2) 그리고 결과가 성공이든 아니든 "조회 성공"이라는 텍스트가 출력된다.

(3) 마지막으로, 테스트가 main 함수에 작성되었기 때문에 매번 서로 다른 테스트 클래스를 동작시켜야 한다.

 

모든 기능에 대하여 테스트를 작성하면서 결과를 개발자가 일일히 눈으로 확인하는것은 매우 비효율적인 일이다. 따라서 테스트 코드가 테스트의 성공/실패 여부를 자동으로 판단하도록 자동화시켜야 한다. 이를 고쳐 보자. 

 

우선, user와 user2의 데이터가 같은지 판단하고, 모든 데이터가 같을 때에만 테스트 성공 메세지가 출력되도록 다음과 같이 수정할 수 있다.

        User user2 = db.get(user.getEmail());
        if(!user.getName().equals(user2.getName())){
        	System.out.println("테스트 실패(name)");
        }
        else if(user.getAge() != user2.getAge()){
        	System.out.println("테스트 실패(age)");
        }
        else {
        	System.out.println("조회 테스트 성공");
        }

 

두번째로, 테스트코드를 모아 놓은 클래스를 만들어서 여러개의 테스트가 모두 실행되도록 수정하면 다음과 같다.

public class UnitTests {

	//테스트할 DB 인터페이스 객체라고 가정
    MyDBConnection db = new MyDBConnection();
    
    public static void main(String[] args) throws SQLException {
    	AddUserTest();
        AnotherTest();
        //... 
    }
    
    public void AddUserTest(){    
        User user = new User();
        user.setEmail("hong@example.com");
        user.setName("홍길동");
        user.setAge(20);
        
        db.add(user);
        
        System.out.println(user.getEmail() + "등록 성공");
        
        User user2 = db.get(user.getEmail());
        if(!user.getName().equals(user2.getName())){
        	System.out.println("테스트 실패(name)");
        }
        else if(user.getAge() != user2.getAge()){
        	System.out.println("테스트 실패(age)");
        }
        else {
        	System.out.println("조회 테스트 성공");
        }
    }
    
    public void AnotherTest(){
    	//...
    }
}

 

 이런 식으로 여러개의 테스트를 스스로 수행 가능하고, 기대하는 결과에 대한 확인까지 해주는 자동화된 테스트를 만들어 두는 것이다. 이 다음은 이 테스트를 통과하도록 MyDBConnection 클래스의 add, get 함수를 구현하고, 테스트가 통과되는것을 확인하면 되겠다. 

 

 

JUnit 

 위와 같은 테스트 코드의 작성을 보다 편하게 도와주는 프레임워크가 있다. 바로 JUnit이다. 

JUnit은 프레임워크다. 
프레임워크의 기본 동작 원리는 제어의 역전IoC 이다. 프레임워크는 개발자가 만든 클래스에 대한 제어 권한을 넘겨받아서 주도적으로 애플리케이션의 흐름을 제어한다. 따라서 프레임워크를 사용할 때엔 main() 메소드도 필요 없고 오브젝트를 만들어서 실행시켜 줄 필요도 없다.

 

위에서 만든 테스트를 JUnit 프레임워크에서 동작시키려면 조건 두가지를 따라야 한다.

 - 메소드를 public으로 만든다.

 - 메소드에 @Test 애노테이션을 붙여 준다.

 

위의 테스트 코드를 JUnit 프레임워크를 사용하는 코드로 수정하면 다음과 같이 바뀐다.

import org.junit.Test;

public class UnitTests {

	//테스트할 DB 인터페이스 객체라고 가정
    MyDBConnection db = new MyDBConnection();
    
    @Test
    public void AddUserTest(){    
        User user = new User();
        user.setEmail("hong@example.com");
        user.setName("홍길동");
        user.setAge(20);
        
        db.add(user);
        
        System.out.println(user.getEmail() + "등록 성공");
        
        assertThat(user2.getName(), is(user.getName());
        assertThat(user2.getAge(), is(user.getAge());
    }
    
    @Test
    public void AnotherTest(){
    	//...
    }
}

 

JUnit의 요구조건 외에도 기존 코드에서 바뀐 부분이 있다.

        assertThat(user2.getName(), is(user.getName());
        assertThat(user2.getAge(), is(user.getAge());

위 코드는 JUnit에서 지원하는 Matcher 이다. assertThat(A,B)는 A가 B 조건을 만족하는지 확인하여 같으면 통과, 다르면 테스트 실패를 발생시킨다. JUnit은 이 밖에도 다양한 Matcher를 지원한다. 

 

https://junit.org/junit5/docs/current/user-guide/#writing-tests-assertions

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

 

JUnit을 사용하면 테스트를 작성하는것 뿐만 아니라, 실행하고 결과를 확인하는것도 훨씬 간편해진다. IDE에서 JUnit 테스트를 실행하면 테스트가 통과되는 경우와 실패한 경우에 아래 그림과 같이 표시된다. 테스트에 실패할 경우, 어떤 테스트 메소드가 실패했으며 왜 실패했는지가 간략히 표시된다.

 

테스트를 모두 통과한 경우
테스트에 실패한 경우

 

 


참고자료

1. https://marsner.com/blog/why-test-driven-development-tdd/

 

Why Test-Driven Development (TDD) | Marsner Technologies

%

marsner.com

2. 토비의 스프링 3.1 Vol.1 

3. https://velog.io/@velopert/TDD%EC%9D%98-%EC%86%8C%EA%B0%9C#%EC%A0%95%EB%A6%AC

 

TDD의 소개

TDD (Test Driven Development · 테스트 주도 개발) 에 대해서 알아봅시다! TDD 는 테스트가 개발을 이끌어 나가는 형태의 개발론입니다. 가장 쉽게 설명하자면, 선 테스트 코드 작성, 후 구현 인데요, 이��

velog.io

 

'스터디' 카테고리의 다른 글

인터넷 일반  (0) 2020.07.14
Spring Framework 소개  (0) 2020.06.25

본 글에서는 2020 백엔드 개발자 로드맵의 첫번째 단계인 인터넷에 대해 알아보고, 정리 해 두고자 합니다.

https://developer.mozilla.org/ 사이트를 주로 참고하였습니다.

 

2020 백엔드 개발자 로드맵

 

1. 인터넷은 어떻게 작동될까요?

 인터넷이란, 컴퓨터와 컴퓨터를 물리적으로(무선 통신도 포함해서) 연결하는 데에서부터 출발합니다. 두 대의 컴퓨터를 연결하려면 하나의 전선만 있으면 되겠지만, 여러 대의 컴퓨터를 서로 연결하려면 필요한 선이 기하급수적으로 늘어나기 마련입니다. 그렇기 때문에, 우리는 여러 대의 컴퓨터들을 서로 서로 연결하는 대신, 중앙에 라우터 라는 장비를 두고 각각의 컴퓨터를 연결합니다.

 

 

 

 같은 원리로, 라우터와 라우터끼리 연결하여 수십 수백대의 컴퓨터끼리도 연결할 수 있겠습니다. 이는 로컬 네트워크라고 부릅니다. 로컬 네트워크를 아주 멀리 있는 지역의 컴퓨터와 연결하려면 이 네트워크를 ISP(Internet Service Provider)에 연결해야 합니다. ISP는 큰 라우터들을 관리하며 연결할 수 있게 해 주는 회사입니다. 인터넷은 이러한 전체 네트워크들의 인프라로 구성됩니다. 

 

2. HTTP는 무엇일까요?

 HTTP(Hyper Text Transfer Protocol)이란 텍스트 기반으로 인터넷에서 데이터를 주고받을 때에 사용되는 통신 규약(Protocol)입니다. TCP와 UDP 통신 위에서 동작하며, 80번 포트를 사용합니다.

 

 HTTP는 연결 상태를 유지하지 않는 비연결성 프로토콜입니다. HTTP는 사용자(클라이언트)가 어떠한 서비스를 서버에 요청하는것(Request)과 서버가 이 요청에 응답하는(Response) 두가지 단계로 이루어집니다. 

 

 

   클라이언트 -> 서버 : 요청(Request)

      서버 -> 클라이언트 : 응답(Response) 

 

 - 요청(Request) 의 종류

HTTP Request에는 다음의 네가지 종류가 있습니다.

GET

데이터의 조회를 요청

POST

데이터의 생성을 요청

PUT

데이터의 수정을 요청

DELETE

데이터의 삭제를 요청

 - 응답(Response)의 종류

HTTP Response는 요청의 결과에 따라 몇가지 상태 코드를 가집니다. 상태 코드의 종류는 크게 분류하자면 다음과 같습니다.

1XX

조건부 응답. 요청을 받았으며 작업을 계속한다.

2XX

성공. 클라이언트의 요청이 성공적이었으며 작업을 완료했다.

3XX

리다이렉션 완료. 클라이언트는 요청을 마치기 위해 추가 작업을 해야 한다.

4XX

요청 오류. 클라이언트의 요청에 오류가 있었다.

5XX

서버 오류. 서버가 유효한 요청을 수행하지 못했다.

 

 - 메시지의 구성 (HTTP/1.1 기준) 

HTTP 요청과 응답은 서로 비슷하게 구성되어 있습니다.

  1. 시작 줄(start-line)에는 실행되어야 할 요청, 또은 요청 수행에 대한 성공 또는 실패가 기록되어 있습니다. 이 줄은 항상 한 줄로 끝납니다.

  2. 옵션으로 HTTP 헤더 세트가 들어갑니다. 여기에는 요청에 대한 설명, 혹은 메시지 본문에 대한 설명이 들어갑니다.

  3. 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(blank line)이 삽입됩니다.

  4. 요청과 관련된 내용(HTML 폼 콘텐츠 등)이 옵션으로 들어가거나, 응답과 관련된 문서(document)가 들어갑니다. 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시됩니다.

- HTTP/1.1과 HTTP/2

 HTTP/1.1 버전의 성능 상의 몇가지 결함 때문에, HTTP/2 버전이 나오게 되었습니다. HTTP/2 버전에서는 프레임 이라는 개념을 도입하여 HTTP 메시지를 나누어 전송합니다. 또한 여러개의 프레임을 묶어 스트림을 구성합니다. HTTP/2에서는 데이터와 헤더 프레임을 분리하여 헤더를 압축할 수 있으며, 스트림 여러개를 하나로 묶을 수도 있습니다.(멀티플렉싱) 

 

 

3. 브라우저와 동작 원리

 브라우저(웹 브라우저)는 인터넷에서 쌍방향으로 통신하며, HTML 문서나 파일을 출력하여 화면에 보여주는 그래픽 사용자 인터페이스(GUI) 기반의 응용 소프트웨어를 말합니다. 주요 웹 브라우저로는 ms의 인터넷 익스플로러, 엣지, 구글 크롬, 모질라 파이어폭스, 오페라, 사파리 등이 있습니다.

 

 브라우저의 주요 기능은 사용자가 선택한 자원을 서버에 요청하고, 서버가 응답한 HTML파일을 해석해서 화면에 표시하는 것입니다. 이 과정은 다음과 같습니다.

 

  1. 사용자가 HTTP를 사용하여 서버에 데이터(HTML 파일) 요청

  2. 서버가 응답함(HTML 파일이 전송됨)

  3. 브라우저에서 HTML 파일을 해석

  4. 브라우저의 렌더링 엔진이 HTML 파일을 화면에 그림 

 

4. DNS와 작동 원리, 도메인 이름이란?

 인터넷에 연결된 모든 장비들은 개인 IP 주소를 가지고 있습니다. 라우터들은 IP 주소를 통해 각각의 장비를 구분할 수 있고, 네트워크에 연결된 다른 장비를 찾아갈 수 있습니다. IP 주소는 32비트의 IPv4(173.194.121.32 와 같은), 128비트의 IPv6(2027:0da8:8b73:0000:0000:8a2e:0370:1337 와 같은) 등으로 표현됩니다. 

 하지만 이러한 IP 주소는 바뀔 수도 있고, 사람이 기억하기엔 너무 어렵습니다. 그렇기때문에 우리는 IP주소 대신, 사람이 읽고 기억하기 쉬운 주소인 도메인 이름(domain name)를 사용하게 되었습니다. 이렇게 IP 주소와 연결된 도메인 주소를 서로 변환시키는 것을 도메인 네임 시스템(Domain Name System, DNS)이라고 부릅니다.

 

 DNS 서버는 각각의 IP 주소와 도메인 주소를 기억하고 있는 DNS 데이터베이스를 갱신하고 관리합니다. 우리가 매번 특정 IP에 접근할때(DNS 리퀘스트를 요청할 때), DNS에서는 다음과 같은 단계를 거칩니다.

 

  1. 브라우저의 주소창에 도메인 이름을 입력 (ex. www.google.com)

  2. 해당 컴퓨터의 local DNS cache에 해당 도메인 이름의 IP 정보가 있는지 확인. 있다면 바로 해당 IP로 접속.

  3. 해당 도메인 이름의 IP를 모른다면, DNS 서버에 관련 정보를 요청함.

  4. 전달받은 IP로 접속하고, 컴퓨터의 local DNS cache에 해당 도메인과 IP 정보를 저장함.

 

5. 호스팅은 무엇일까요?

 웹 호스팅은 기업이나 사용자가 웹 사이트나 웹 페이지를 인터넷에 게시할 수 있도록 해주는 서비스입니다. 이러한 서비스를 통해 인터넷에 게시하고자 하는 데이터를 웹 호스팅 업체의 서버에 등록하면, 사용자는 등록한 IP와 도메인 이름을 통해 해당 데이터에 언제든 접근할 수 있습니다. 호스팅 서비스를 사용하려면 도메인 이름을 가지고 있어야 하고, 만일 도메인 이름이 없다면 호스팅 서비스 업체에서 제공해주기도 합니다.

 

 

 

 


참고자료

1. https://developer.mozilla.org/ko/docs/Learn/Common_questions/How_does_the_Internet_work

2. https://developer.mozilla.org/ko/docs/Learn/Common_questions/What_is_a_domain_name

3. https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

4. https://velog.io/@surim014/HTTP%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

5. https://d2.naver.com/helloworld/59361

6. https://www.website.com/beginnerguide/webhosting/6/1/what-is-web-hosting?.ws

 

'스터디' 카테고리의 다른 글

테스트 주도 개발, JUnit  (0) 2020.08.05
Spring Framework 소개  (0) 2020.06.25

1. 소개

 1.1 Spring framework

   - 자바 엔터프라이즈 개발을 위한 오픈 소스 애플리케이션 프레임워크 (간단히 스프링이라고 부른다)

   - 자바 가상 머신(JVM) 위에서 동작하는 언어들을 지원한다. (Groovy, Kotlin 등)

   - 아파치 라이선스 2.0

   - 스프링 프레임워크 5.1 기준 JDK 8+(Java SE 8+)를 필요로 하고 JDK 11 LTS 버전도 지원한다.

   - 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다.

 

 스프링은 여러 개의 모듈로 이루어져 있고, 필요한 모듈만 선택하여 사용하는것이 가능하다. 

 

 

1.2 스프링 프레임워크와 스프링 부트

  스프링 프레임워크는 지원하는 기능과 라이브러리가 많기때문에 환경설정을 하기가 복잡하다. 때문에 필요한 라이브러리를 간편하게 설정하고 바로 실행 가능한 프로그램을 만들 수 있도록 나온것이 스프링 부트다.

스프링 부트의 주요 특징은 다음과 같다.

 

 - 내장 Tomcat, Jetty등을 포함하고 있어 WAR 파일을 배포하지 않아도 프로그램을 바로 실행할 수 있게 해 준다.

 - 프로젝트 생성 시 필요한 라이브러리 의존성을 선택하고 바로 시작할 수 있도록 해 준다. (Spring Initializr)

 - 스프링 프레임워크, 3rd 라이브러리를 자동으로 configure 해 준다.

 

2. 스프링의 주요 Features

 2.1 자바 객체를 직접 관리

  - 스프링은 경량 컨테이너로서 자바 객체를 직접 관리한다.

  - 각 객체의 생성, 소멸과 같은 라이프 사이클을 관리해준다.

  - 프로그래머는 필요한 객체를 스프링에게서 받아와서 사용하면 된다.

 

 2.2 POJO 사용

  - Plain Old Java Object (POJO) 방식의 프레임워크이다.

  - 스프링의 기능을 사용하기 위해 특정한 인터페이스나 클래스를 상속받을 필요가 없어 사용하기에 편하고 객체가 가볍다.

 

 2.3 의존성 주입(Dependency Injection, DI)

  - 의존성 주입을 방식으로 제어 역전을 구현한다.

  - 제어 역전(Inversion of Control, IoC), 또는 제어 반전이란 프로그래머가 작성한 프로그램이 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말한다. 전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용한다. 하지만 제어 반전이 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출한다. (참고)

 - 각각의 계층이나 서비스 객체 간에 의존성이 존재할 경우, 스프링이 이를 확인하고 런타임에 서로 연결시켜 준다.

 

 2.4 관점 지향 프로그래밍(Aspect Oriented Programming, AOP)

  - 관점 지향 프로그래밍은 횡단 관심사(cross-cutting concerns)들을 코드에서 분리함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

  - 횡단 관심사란, logging, security, transaction 등과 같이 프로그램의 핵심 기능은 아니면서도 코드 전체에 걸쳐서 사용되며, 다른것에 영향을 미칠 수 있는 것들을 뜻한다.

  - AOP는 이러한 "부가 기능"들을 모듈화하여 관리한다.  

 

 

 2.5 이식 가능한 서비스 추상화 (Portable Service Abstraction, PSA)

 - 스프링은 다른 완성도 높은 프레임워크들과 쉽게 연결할 수 있는 인터페이스를 제공한다.

 - 예를 들어 MySQL, PostgreSQL, MongoDB와 같은 DB를 위한 인터페이스나 Servlet, React, Tomcat과 같은 서비스와 연동을 지원한다.

 - 프로그래머는 코드를 바꾸지 않고도 연결된 구현체를 쉽게 교체할 수 있다.   

 

 예를 들어, 스프링의 JPA 인터페이스를 사용하면 다음과 같이 Query문을 작성하지 않고도 간편하게 DB와 연동시킬 수 있다. 

package payroll;
import org.springframework.data.jpa.repository.JpaRepository;

interface EmployeeRepository extends JpaRepository<Employee, Long> {
          //JPA를 사용하여 DB와 연동하기 위한 클래스 선언
}
@GetMapping("/employees")
List<Employee> all() {
    return repository.findAll();   //DB의 모든 데이터를 반환 
}

@PostMapping("/employees")
Employee newEmployee(@RequestBody Employee newEmployee) {
    return repository.save(newEmployee);      //DB에 대로운 객체 저장
}

 

 

3. 결론적으로

 - 스프링을 사용하면 모듈화 하기 좋고 매우 유연한 코드 작성 가능

 - 안정적인 라이브러리 제공으로 프로그램의 품질 관리, 유지보수성 향상

 - 프로그래머의 개발 속도 향상 

 

 


아파치 라이선스 2.0

 아파치 소프트웨어 재단에서 자체적으로 만든 소프트웨어에 대한 라이선스 규정. 누구나 해당 소프트웨어에서 파생된 프로그램을 제작할 수 있으며 저작권을 양도, 전송할 수 있다. 아파치 라이선스에 따르면 누구든 자유롭게 아파치 소프트웨어를 다운 받아 부분 혹은 전체를 개인적 혹은 상업적 목적으로 이용할 수 있으며 재배포시에는 원본 소스 코드 또는 수정한 소스 코드를 반드시 포함시켜야 하는 것은 아니고 아파치 라이선스, 버전 2.0을 포함시켜야 하며 아파치 소프트웨어 재단에 개발된 소프트웨어라는 것을 명확하게 밝혀야 한다.

 

 

'스터디' 카테고리의 다른 글

테스트 주도 개발, JUnit  (0) 2020.08.05
인터넷 일반  (0) 2020.07.14

+ Recent posts