Spring Boot/웹 개발 이론

웹 개발, REST API

운동하는 주니어개발자 2023. 4. 20. 02:44

오늘은 저번 시간에 마저 마무리하지 못했던 디자인 패턴에 대해서 마무리를 하고 웹 개발 이론에 대해서 공부했다.

우선 디자인 패턴부터 설명을 마무리 하겠다.

Facade pattern

Facade pattern이란 건물의 앞쪽 정면 이라는 뜻을 가진다. 여러 개의 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존관계가 있을 때 중간에 facade라는 객체를 두고 여기서 제공하는 interface만을 활용하여 기능을 사용하는 방식이다. Facade는 자신이 가지고 있는 각 클래스의 기능을 명확히 알아야 한다.

Facade pattern의 예제

Client와 Ftp, Writer, Reader를 이용하여 Host, Path를 연결하고 FTP 연결을 종료하는 예제와 파일을 읽고 쓰는 예제를 실습하였다.

Ftp.java

package com.company.design.facade;

import java.awt.*;

public class Ftp {

    private String host;
    private int port;
    private String path;

    public Ftp(String host, int port, String path) {
        this.host = host;
        this.port = port;
        this.path = path;
    }

    public void connect() {
        System.out.println("FTP Host : "+host+" Port : "+port+" 로 연결 합니다.");
    }

    public void moveDirectory() {
        System.out.println("FTP path : "+path+" 로 연결 합니다.");
    }

    public void disConnect() {
        System.out.println("FTP 연결을 종료 합니다.");
    }
}

Reader.java

package com.company.design.facade;

public class Reader {

    private String fileName;

    public Reader(String fileName) {
        this.fileName = fileName;
    }

    public void fileConnect() {
        String msg = String.format("Reader %s 로 연결 합니다.",fileName);
        System.out.println(msg);
    }

    public void fileRead() {
        String msg = String.format("Reader %s 의 내용을 읽어 옵니다.",fileName);
        System.out.println(msg);
    }

    public void fileDisconnect() {
        String msg = String.format("Reader %s 로 연결 종료 합니다..",fileName);
        System.out.println(msg);
    }
}

SftpClient.java

package com.company.design.facade;

public class SftpClient {

    private  Ftp ftp;
    private Reader reader;
    private Writer writer;

    public SftpClient(Ftp ftp, Reader reader, Writer writer) {
        this.ftp = ftp;
        this.reader = reader;
        this.writer = writer;
    }

    //오버로딩
    public SftpClient(String host, int port, String path, String fileName) {
        this.ftp = new Ftp(host, port, path);
        this.reader = new Reader(fileName);
        this.writer = new Writer(fileName);
    }

    public void connect() {
        ftp.connect();
        ftp.moveDirectory();
        writer.fileConnect();
        reader.fileConnect();
    }

    public void disConnect() {
        writer.fileDisconnect();
        reader.fileDisconnect();
        ftp.disConnect();
    }

    public void read() {
        reader.fileRead();
    }

    public void writer() {
        writer.write();
    }
    
    
}

Writer.java

package com.company.design.facade;

public class Writer {

    private String fileName;

    public Writer(String fileName) {
        this.fileName = fileName;
    }

    public void fileConnect() {
        String msg = String.format("Writer %s 로 연결 합니다.",fileName);
        System.out.println(msg);
    }

    public void fileDisconnect() {
        String msg = String.format("Writer %s 로 연결 종료 합니다.",fileName);
        System.out.println(msg);
    }

    public void write() {
        String msg = String.format("Writer %s 로 파일쓰기를 합니다.",fileName);
        System.out.println(msg);
    }
}

facade_Main.java

package com.company.design;

import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.SftpClient;
import com.company.design.facade.Writer;

import java.util.Objects;

public class facade_Main {
    public static void main(String[] args) {
        Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
        ftpClient.connect();
        ftpClient.moveDirectory();

        Writer writer = new Writer("text.tmp");
        writer.fileConnect();
        writer.write();

        Reader reader = new Reader("text.tmp");
        reader.fileConnect();
        reader.fileRead();

        reader.fileDisconnect();
        writer.fileDisconnect();
        ftpClient.disConnect();

        SftpClient sftpClient = new SftpClient("www.foo.co.kr", 22, "/home/etc", "text.tmp");
        sftpClient.connect();

        sftpClient.writer();

        sftpClient.read();

        sftpClient.disConnect();
    }
}

다음은 Strategy pattern에 대해 설명하겠다.

Strategy pattern이란 전략 패턴으로 불리며 객체지향의 꽃이다. 유사한 행위들을 캡슐화하여 객체의 행위를 바꾸고 싶은 경우 직접 변경하는 것이 아닌 전략만 변경 하여 유연하게 확장 하는 패턴 SOLID중에서 개방폐쇠 원칙과 의존 역전 원칙을 따른다.

전략 메서드를 가진 전략 객체 (Normal Strategy, Base64 Strategy)

전략 객체를 사용하는 컨텍스트 (Encoder)

전략 객체를 생성해 컨텍스트에 주입하는 클라이언트

Strategy pattern의 예제

Normal Strategy와 Base64 Strategy를 이용하여 Encoder을 하고 append를 이용하여 기존 값에 값을 추가하는 예제를 실습하였다.

Base64Strategy.java

package com.company.design.strategy;

import java.util.Base64;

public class Base64Strategy implements EncodingStrategy{

    @Override
    public String encode(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
}

Encoder.java

package com.company.design.strategy;

public class Encoder {
    private EncodingStrategy encodingStrategy;

    public String getMessage(String message) {
        return this.encodingStrategy.encode(message);
    }

    public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
        this.encodingStrategy = encodingStrategy;
    }
}

Encoding(인터페이스)

package com.company.design.strategy;

public interface EncodingStrategy {
    String encode(String text);
}

NormalStrategy.java

package com.company.design.strategy;

public class NormalStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return text;
    }
}

Strategy pattern의 예제 결과화면

Strategy pattern의 결과화면 이후 Append를 이용하여 메시지인 hello java앞에 ABCD라는 메시지를 추가하는 간단한 추가 예제이다.

AppendStrategy.java

package com.company.design.strategy;

public class AppendStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return "ABCD"+text;
    }
}

이렇게 Append를 사용하여 문자를 추가하게 되면 다음 결과화면과 같이 출력되게 된다.

Strategy pattern의 Append 추가 예제 결과화면

이상으로 디자인 패턴에 대한 공부는 마무리 되었다. 이제 부터는 Spring을 본격적으로 배우기 위해 기본적인

내용을 공부할 예정이다. 우선 오늘 공부한 내용부터 설명 하겠다. 오늘은 웹 개발에 대해 조금 공부하였다.

웹 개발 개론

Web 이란 (World Wide Web, WWW, W3)은 인터넷에 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 세계적인 정보 공간을 말한다. Web의 용도는 다양하게 나눌 수 있다.

Web Site

google, naver, daum, facebook 등 HTML로 구성된 여러 사이트들

API(Application Programming Interface) * Web Service

Kakao Open API, Google Open API, Naver Open API 등

User Interface

Chrome, Safari, Explorer, Smart Watch, IP TV 등으로 나눌 수 있다.

Web의 기본 3가지 요소

다음으로는 REST API에 대해서 설명 하겠다. 처음으로는 REST API의 규약에 대해 간단하게 설명하겠다.

REST API의 규약으로는 6가지가 있다.

REST API 규약

REST (Representational State Transfer : 자원의 상태 전달) - 네트워크 아키텍처

1. Clint, Server : 클라이언트와 서버가 서로 독립적으로 분리 되어 있어야 한다.

2. Stateless : 요청에 대해서 클라이언트의 상태를 서버에 저장하지 않는다.

3. Cache : 클라이언트는 서버의 응답을 Cache(임시저장) 할 수 있어야 한다.

3.1 : 클라이언트가 Cache를 통해서 응답을 재사용할 수 있어야 하며, 이를 통해서 서버의 부하를 낮춘다.

4. 계층화 : 서버와 클라이언트 사이에 방화벽, 게이트웨이, Proxy 등 다양한 계층 형태로 구성이 가능해야 하며 이를 확장 할 수 있어야 한다.

5. 인터페이스 일관성 : 인터페이스의 일관성을 지키고 아키텍처를 단순화시켜 작은 단위로 분리하여 클라이언트, 서버가 독립적으로 개선 될 수 있어야 한다.

6. Code on Demand(Optional) : 자바 애플릿, 자바스크립트, 플래시 등 특정한 기능을 서버로 부터 클라이언트가 전달받아 코드를 실행 할 수 있어야 한다.

REST API를 개발하기 위해 무조건 적으로 따라야 하는것은 아니지만 어느 정도 맞춰야한다는 생각으로 참고를 하면서 개발을 하면 좋다. 인터페이스 일관성이 잘 지켜졌는지에 따라 REST를 잘 사용했는지 판단이 가능하다.

REST 인터페이스 일관성에 대해 알아보겠다.

1. 자원의 식별

▶ 웹 기반의 REST에서는 리소스 접근을 할 때 URI를 사용한다.

2. 메시지를 통한 리소스 조작

▶ Web에서는 다양한 방식으로 데이터를 전달 할 수 있습니다.

▶ 그 중에서 가장 많이 사용하는 방식은 HTML, XML, JSON, TEXT 등 이 있습니다.

▶ 이 중에서 어떠한 타입의 데이터인지를 알려주기 위해서 HTTP Header 부분에 content-type을 통해서

데이터의 타입을 지정해 줄 수 있습니다.

또한 리소스 조작을 위해서 데이터 전체를 전달 하지 않고 이를 메시지로 전달 합니다.

Ex) 서버의 user라는 정보웃의 전화번호를 처음에는 number로 결정했고 이 정보를 Client와 주고 받을 때 그대로 사용하고 있었다면 후에 서버의 resource 변경으로 phone-number로 바뀌게 된다면 Client는 처리를 하지 못하고 에러가 난다.

이러한 부분을 방지 하기 위하여 별도의 메시지의 형태로 데이터를 주고 받으며 client-server가 독립적으로 확장 가능하도록 한다.

3. 자기 서술적 메시지

▶ 요청하는 데이터가 어떻게 처리 되어져야 하는지 충분한 데이터를 포함 할 수 있어야 한다.

▶ HTTP 기반의 REST에서는 HTTP Method 와 Header 정보, 그리고 URI의 포함되는 정보로 표현 할 수 있습니다.

4. 애플리케이션 상태에 대한 엔진으로써 하이퍼미디어

▶ REST API를 개발할 때 단순히 Client 요청에 대한 데이터만 응답 해주는 것이 아닌 관련된 리소스에 대한

Link 정보까지 같이 포함 되어져야 한다.

이러한 조건들을 잘 갖춘 경우 REST Ful 하다고 표현하고 이를 REST API라고 부른다.

오늘 공부한 내용은 여기 까지이다. 아직 웹 개발 개론 파트가 2개 남았지만 다음 공부시간에 할 예정이다..휴

내일은 금요일이다!! 금요일은 내가 정한 휴일이다.. 일주일에 금요일 하루만 쉬면서 공부를 하고 있다..

이렇게 해도 할 공부는 아직도 산더미같이 많은거 같다.. 우선은 내일은 쉬는날이니까 쉬고 토요일에 다시 오겠다!!

아마 주말에는 코딩테스트 공부를 하기로 계획을 짜놨기 때문에 웹 개발 개론은 월요일에 다시 오픈할 예정이다.

그럼 토요일에 코딩테스트로 돌아오겠다. 그럼 20000 ~~

'Spring Boot > 웹 개발 이론' 카테고리의 다른 글

URI, URL, HTTP 프로토콜  (0) 2023.04.20