Java Day 22

YDC·2025년 7월 31일

우테코8기

목록 보기
22/23

Day21 복습

삽입정렬

첫 번째 패스 스루일때 임시로 인덱스 1(두번째 셀의 값)을 삭제하고 임시 변수에 저장함
인덱스 1에 공백이 생기고 왼쪽에 있는 값과 비교 후 그 값이 임시 변수보다 크다면 오른쪽으로 시프트함
임시로 삭제한 값보다 더 작은 값을 만나거나 배열의 왼쪽 끝에 도달해야 시프트가 끝남 배열이 완전히 정렬될 때까지 반복함

평균 시나리오

최악의 시나리오의 경우 선택 정렬이 삽입정렬보다 빠른게 맞으나 평균시나리오도 중요하게 고려해야함
최선과 최악의 시나리오는 상대적으로 드물게 발생함 실제로는 평균 시나리오가 일어남

최선의 평균 최악의 시나리오를 구분하는 능력은 기존 알고리즘을 최적화해서 훨씬 빠르게 만드는 것만큼이나
사용자 요구에 맞는 최적의 알고리즘을 고르는 핵심 기술임

OSI 7 계층이란?

OSI 7 계층은 네트워크 통신이 일어나는 과정을 7단계로 나눈 국제 표준화 기구(ISO)에서 정의한 네트워크 표준 모델

1계층 - 물리계층(Physical Layer)

  • 주로 전기적, 기계적, 기능적인 특성을 이용해서 통신 케이블로 데이터를 전송하는 물리적인 장비
  • 단지 데이터 전기적인 신호(0,1)로 변환해서 주고받는 기능만 할 뿐
  • 이 계층에서 사용되는 통신 단위 : 비트(Bit)이며 이것은 1과 0으로 나타내어지는, 즉 전기적으로 On, Off 상태
  • 장비 : 통신 케이블, 리피터, 허브 등
  • 물리계층을 통해 송수신되는 정보의 오류와 흐름을 관리하여 안전한통신의 흐름을 관리
  • 프레임에 물리적 주소(MAC address)를 부여하고 에러검출, 재전송, 흐름제어를 수행
  • 이 계층에서 전송되는 단위 : 프레임(Frame)
  • 장비 : 브리지, 스위치, 이더넷 등(여기서 MAC주소를 사용)
  • -> 브릿지나 스위치를 통해 맥주소를 가지고 물리계층에서 받은 정보를 전달함.

3계층 - 네트워크 계층(Network Layer)

  • 데이터를 목적지까지 가장 안전하고 빠르게 전달
  • 라우터(Router)를 통해 경로를 선택하고 주소를 정하고(IP) 경로(Route)에 따라 패킷을 전달 > IP 헤더 붙음
  • 이 계층에서 전송되는 단위 : 패킷(Packet)
  • 장비 : 라우터

4계층 - 전송 계층(Transport Layer)

  • port 번호, 전송방식(TCP/UDP) 결정 > TCP 헤더 붙음
    • TCP : 신뢰성, 연결지향적
    • UDP : 비신뢰성, 비연결성, 실시간
  • 두 지점간의 신뢰성 있는 데이터를 주고 받게 해주는 역할
  • 신호를 분산하고 다시 합치는 과정을 통해서 에러와 경로를 제어

5계층 - 세션 계층(Session Layer)

  • 주 지점간의 프로세스 및 통신하는 호스트 간의 연결 유지
  • TCP/IP 세션 체결, 포트번호를 기반으로 통신 세션 구성
  • API, Socket

6계층 - 표현 계층(Presentation Layer)

  • 전송하는 데이터의 표현방식을 결정(ex. 데이터변환, 압축, 암호화 등)
  • 파일인코딩, 명령어를 포장, 압축, 암호화
  • JPEG, MPEG, GIF, ASCII 등

7계층 - 응용 계층(Application Layer)

  • 최종 목적지로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행(ex. explore, chrome 등)
  • HTTP, FTP, SMTP, POP3, IMAP, Telnet 등과 같은 프로토콜이 있다.

TCP/IP 4계층이란?

OSI 7계층 보다 먼저 나온 규격이나 현재 더 많이 활용 된다

1계층 - 네트워크 액세스 계층(Network Access Layer)

  • OSI 7계층의 물리계층(1)과 데이터 링크 계층(2)에 해당
  • TCP/IP 패킷을 네트워크 매체로 전달하는 것과 네트워크 매체에서 TCP/IP 패킷을 받아들이는 과정을 담당
  • 에러 검출 기능(Detecting errors), 패킷의 프레임화(Fraimg packets)
  • 네트워크 접근 방법, 프레임 포맷, 매체에 대해 독립적으로 동작하도록 설계.
  • 물리적인 주소로 MAC을 사용
  • LAN, 패킷망, 등에 사용됨

2계층 - 인터넷 계층(Internet Layer)

  • OSI 7계층의 네트워크 계층(3)에 해당
  • 어드레싱(addressing), 패키징(packaging), 라우팅(routing) 기능을 제공
  • 네트워크상 최종 목적지까지 정확하게 연결되도록 연결성을 제공하게 됨.
  • 프로토콜 종류 – IP, ARP, RARP

3계층 - 전송 계층(Transport Layer)

  • OSI 7계층의 전송 계층(4)에 해당
  • IP와 Port를 이용하여 프로세스와 통신
  • 애플리케이션 계층의 세션과 데이터그램(datagram) 통신서비스 제공
  • 통신 노드 간의 연결을 제어하고, 신뢰성 있는 데이터 전송을 담당한다.
  • 프로토콜 종류 – TCP, UDP

4계층 - 응용 계층(Application Layer)

  • OSI 7계층의 세션 계층(5), 표현 계층(6), 응용 계층(7)에 해당한다.
  • 프로그램(브라우저)가 직접 인터액트하는 레이어. 데이터를 처음으로 받는곳
  • 다른 계층의 서비스에 접근할 수 있게 하는 애플리케이션을 제공
  • 애플리케이션들이 데이터를 교환하기 위해 사용하는 프로토콜을 정의
  • HTTP, SMTP등의 프로토콜을 가진다.
  • TCP/UDP 기반의 응용 프로그램을 구현할 때 사용한다.
  • 프로토콜 종류 – FTP, HTTP, SSH

OSI는 개념 모델, TCP/IP는 실제 구현 모델
OSI는 이론적으로 완벽하게 쪼개놓은 것

학습목표

백준 3문제

  • 2444 별찍기 7
  • 10988 팰린드롬인지 확인하기
  • 1157 단어공부

CS

  • 누구나 자료 구조와 알고리즘 7강

JAVA Spring

  • 스프링 부트 핵심가이드 1~2강

백준 3문제

1.2444 별찍기 7

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

예제 입력 1 

5

예제 출력 1 

*







*

풀이

package advance;
import java.util.Scanner;

public class BOJ_2444_Star {
    public static void  main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i =1; i<=n;i++){
            for(int j =0 ; j<n-i;j++){
                System.out.print(" ");
            }
            for(int j =0; j<2*i-1;j++){
                System.out.print("*");
            }
            System.out.println();
        }
        for(int i = n-1;i>0;i--){
                for(int j =0 ; j<n-i;j++){
                    System.out.print(" ");
                }
                for(int j =0; j<2*i-1;j++){
                    System.out.print("*");
                }
                System.out.println();
        }
    }

}

반복문의 조건을 잘 분석하고 패턴을 잘 생각해서 풀어야하는 문제

2.10988팰린드롬인지 확인하기

문제

알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다. 
level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.

입력

첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.

출력

첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.

예제 입력 1 

level

예제 출력 1 

1

예제 입력 2 

baekjoon

예제 출력 2 

0

풀이

package advance;
import java.util.Scanner;
public class BOJ_10988_Palindrome {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String  word = sc.nextLine();
        int len = word.length();

        for(int i =0;i<len/2;i++){
            if(word.charAt(i)!=word.charAt(len-1-i)){
                System.out.println(0);
                return;
            }
        }
        System.out.println(1);
    }
}

또는

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        String reverseWord = new StringBuilder(word).reverse().toString();
        if(word.equals(reverseWord)){
            System.out.println(1);
        }else{
            System.out.println(0);
        }
    }
}

.reverse로 문자열 뒤집기 StringBuilder로 재구성

문자열 처리 기본적인 사고력을 물어보는 문제

3.1157 단어공부

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제 입력 1 

Mississipi

예제 출력 1 

?

예제 입력 2 

zZa

예제 출력 2 

Z

예제 입력 3 

z

예제 출력 3 

Z

예제 입력 4 

baaa

예제 출력 4 

A

풀이

package advance;
import java.util.Locale;
import java.util.Scanner;
public class BOJ_1157_StudyWord {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine().toUpperCase();
        int [] count = new int[26];
        for(int i=0;i<word.length();i++){
           char ch = word.charAt(i);
           count[ch-'A']++;
        }
        int max = -1;
        char result = '?';
        for(int i =0;i<26;i++){
            if(count[i]>max) {
                max = count[i];
                result = (char) (i + 'A');
            }else if (count[i]==max){
                result = '?';
            }
        }
        System.out.println(result);
    }
}

CS

1.누구나 자료구조와 알고리즘 7강

해시테이블이란

대부분의 프로그래밍 언어는 해시 테이블이라는 자료 구조를 포함하며, 해시 테이블에는 빠른 읽기라는게 있다
해시 테이블은 다양한 프로그래밍 언어로서 서로 다른 이름으로 불림 해시, 맵, 해시맵, 딕셔너리, 연관 배열 등
해시 테이블은 쌍으로 이뤄진 값들의 리스트임 첫 번째 항목을 키라 부르고 두번 째 항목을 값이라고 부름
Menu = { “French fries” => 0.75} French fries 가 키 고 0.75가 값임
해시 테이블의 값 룩업은 딱 한단계만 걸리므로 평균적으로 효율성이 O(1)임

해싱

문자를 가져와 숫자로 변환하는 이러한 과정을 해싱이라고 부름
글자를 특정 숫자로 변환하는데 사용한 코드를 해시 함수라고 부름

해시테이블 예시 유의어 사전

Thesaurus{"bad”} = “evil”
코드로 표현하면 해시 테이블은 {“bad”=“evil”}이렇게 됨
Bad 는 214 =8로 해싱되고 컴퓨터는 셀8에 evil을 집어 넣음
반대로 bad의 값을 룩업하다고 하면 bad = 8 셀8을 찾아서 저장된 값을 반환함
컴퓨터는 룩업하고 있는 키를 해싱해서 해당하는 값을 얻고 그 값에 해당하는 셀로 바로가기때문에 O(1)의 효율성을 가짐
배열에서 메뉴 항목의 값을 룩업하려면 항목을 찾을 때까지 값을 순회하면 검색해야했음
정렬되지 않은 배열에서는 최대 O(N) 정렬된 배열에서는 최대 O(logN)이걸리나 해시 테이블을 사용하면 O(1)만에 할 수 있음

충돌 해결

하지만 해시 테이블에도 문제가 있음 bad 와 dab이 있다면 같이 해싱이 8로 됨 이러면 충돌이 일어남
지를 해결 하는 방법 중 하나가 분리 연결 법임 충돌이 발생했을때 셀에 하나의 값을 넣는 대신 배열로의 참조를 넣는 방법임
셀8에 evil이 들어있는데 dab pat을 추가하면 셀 8에는 bad evil , dab pet이라는 배열이 들어가기됨
여기로 dab를 룩업하면 컴퓨터는 해당 키를 해싱하고 셀8을 룩업함
그안에서 인덱스 0을 찾아보고 룩업하고있는 dab이 있는지 배열을 차래대로 검색함
위와같이 모든 데이터가 해시 테이블의 한셀에 들어가게 된다면 해시테이블은 배열보다 나은게 없음
따라서 최악의 경우 해시테이블의 룩업 성능은 O(N)임 이렇기 때문에 해시 테이블에 충돌이 거의 없도록 디자인 해야함

충돌조정

해시 테이블은 해시테이블에 얼마나 데이터를 저장하는지 얼마나 많은 셀을 쓸 수 있는지 어떤 해시함수를 사용하는지에 따라 효율성이 정해짐
좋은 해시 함수란 사용 가능한 모든 셀에 데이터를 분산시고 많은 메모리를 낭비하지 않으면서 균형을 유지하면서 충돌을 피해야함
충돌 조정을 위해 컴퓨터 과학자는 규칙을 세웠음 제장된 데이터가 7개면 셀이 10개여한다 등 데이터와 셀 간 이러한 비율을 부하율이라고함

Java

1.스프링부트 핵심 가이드 1강

Spring Framework란?

Javar기반의 애플리케이션 프레임 워크로 엔터 프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공함

1.제어역전

자바는 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 하용함
객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이나 스프링은 제어역전의 특징으로 개발 방식이 다름

사용할 객체를 직접 생산하지 않고 객체의 생명주기 관리를 외부에 위임함 여기서 외부는 스프링 컨테이너 또는 IoC컨테이너를 의미함

객체의 관리를 컨테이너에게 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르고 제어역전을. 통해 의존성 주입(DI) 관점지향 프로그래밍(AOP)등이 가능해짐

2.의존성 주입

의존성주입(DI)란이란 제어 역전의 방법중 하나로 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미함
스프링에서 의존성을 주입받는 방법츤 세 가지가 있음
1.생성자를 통한 의존성 주입
2.필드 객체 선언을 통한 의존성 주입
Setter 메서드를 통한 의존성 주입

@Autowired라는 어노테이션을 통해 의존성을 주입할 수도 있음

생성자를 통한 의존성 주입 예시
@RestController

Public class DIController{

MyService myService;

@Autowired

Public DiController(Myservice myScerivce){
this.myService = myService;
}

@GetMapping(“/di/hello”)

Public String getHello(){
return myService.getHello();
}
}

필드 객체 선언을 통한 의존성 주입
@RestController

Public class FieldInjectionController{

@Autowired
Private MyService myService;

}

setter 메서드를 통한 의존성 주입
@RestController
Public class SetterInjectionController{

MyService myService;

@AutoWired
Public void setMyService(MyService myService){
this.myService = myService;
}

스프링에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식임
다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이 객체를 초기화 할 수 없기 때문에

3.관점 지향 프로그래밍(AOP)

AOP관점 지향 프로그래밍은 OOP를 더 잘 사용하도록 돕는 개념임
AOP는 관점을 기준으로 묶어 개발하는 방식을 의미함

OOP방식의 애플리케이션 로직은 객체마다 핵심 기능을 수행하기 위한 로직과 함께 부가 기능인 로깅 트랜잭션 등의 코드를 작성함
유지보수 목적이나 데이터 베이스 접근을 위해 작성된 로깅과 트랜잭션 영역은 같은 기능을 수행할 확률이 높음
즉 핵심 기능을 구현한 두 로직에 동일한 코드가 포함된다는걸 의미함

AOP의 관점에서 부가기능은 핵심기능이 어떤 기능인지 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 됨
비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 함

AOP를 구현 하는 방법은 크게 세 가지가 있음

1.컴파일 과정에서 삽입 하는 방식
2.바이트코드를 메모리에 로드하는 과정에 삽입하는 방식
3.프락시 패턴을 이용하는 방식

스프링은 디자인 패턴중 하나인 프락시 패턴을 통해 AOP기능을 제공하고 있음

AOP의 목적은 OOP와 마찬가지로 모듈화를 해서 재사용 가능한 구성을 만드는 것이고
모듈화 된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중하게 해줌

2.스프링부트 핵심 가이드 2강

1.서버간 통신

단일 서비스로 구성된 A포털 사이트와 B 포털 사이트간에 통신을 서버 간 통신이라고 함
서버간 통신은 한 서버가 다른 서버에 통신을 요청하는걸 의미하며 한대는 서버 다른 한대는 클라이언트가 되는 구조임
주로 많이 사용되는 방식은 HTTP,HTTPS방식임

2.스프링 부트의 동작 방식

스프링 부트는 spring-boot-starter-web모듈을 사용하면 기본적으로 톰캣을 사용하는 스프링MVC구조를 기반으로 동작함

서블릿은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술임
일반적으로 서블릿은 서블릿 컨테이너에서 관리하는데 서블릿 컨테이너는 서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체임
톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너임
스프링에서는 DispatcherServlet이 서블릿의 역할을 수행함
Dispatchseblet의 동작은 요청이 들어오면 핸들러 매핑을 통해 요청 URI에 매핑된 핸들러를 탐색하고 핸들러 어댑터로 컨트롤러를 호출함
컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해서 반환함 뷰형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버를 통한 뷰를 받아 리턴함

핸들러 매핑은 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선텅하는 인터페이스임 핸들러 매핑 인터페이스는 여러구현체를 가짐
예시
BeanNameUrlHandlerMapping
빈 이름을 URL로 사용할때 사용하는 매핑 전략
빈을 정의할때 슬래시가 들어가면 매핑 대상이 됨
@Bean(“/hello”)

ControllerClassNameHandlerMapping
URL과 일치하는 클래스 이름을 갖는 빈을 컨트롤러로 사용하는 전략
이름중 Controller를 제외하고 앞부분에 작성된 sulfix를 소문자로 매핑함

SimpleUrlHandlerMapping
URL패턴에 매핑된 컨트롤러를 사용하는 전략

DefaultAnnotationHandlerMapping
어노테이션으로 URL과 컨트롤러를 매핑하는 방법

3.레이어드 아키텍쳐

레이어트 아키텍처란
애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레어이로 묶어 수평적으로 구성한 구조를 의미함

레이어드 아키텍쳐는 여러방면에서 쓰이는 개념이며 어떻게 설계하느냐에 따라 용어와 계층의 수가 달리짐
일반적으로는 3계층 또는 4계층 구성을 의미함 인프라 레이어의 추가 여부로 달라짐

3계층의 경우

프레젠 테이션 계층
애플리케이션의 최상단 계층으로 클라이언트 요청을 해석하고 응답하는 역할
UI또는 API를 제공함

비즈니스 계층
애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할을 수행함
DDD(Domain-Driven Design) 기반의 아키텍처에서는 비즈니스 로직에 도메인이 포함 되기도하고 별도로 계층을 두기도 함

데이터 접근 계층
데이터베이스에 접근하는 일련의 작업을 수행함

레이어드 아키텍처의 설계는 다음과 같은 특징을 가짐
각 레이어는 가장 가까운 하위 레이어의 의존성을 주입받음
각 레이어는 관심사에 따라 묶여 있으며, 다른 레이어의 역할을 침범하지 않음
각 레이어가 독립적으로 작성되면 다른 레이어와 의존성을 낮춰 단위 테스트에 용의함

스프링 레이어드 아키텍처 구성

프레젠테이션 계층
상황에 따라 유저 인터페이스 계층이라고도 함
클라이언트와 접점이 됨
클라이언트로부터 ㅔ이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할을 함

비즈니스 계층
상황에따라 서비스 계층이라고도 함
핵심 비즈니스 로직을 구현함
트랜잭션 처리나 유효성 검사 등의 작업도 수행함

데이터 접근 계층
상황에 따라 영속 계층이라고도 함
데이터 베이스에 접근하는 작업을 수행함

4.디자인 패턴

디자인 패턴은 소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책임
애플리케이션 개발에서 발생하는 문제는 유사한 경우가 많고 해결책도 동일하게 적용할 수 있기때문에 패턴이라고함
그러나 디자인 패턴이 모든 문제의 정답은 아니고 상황에 맞는 최적의 패턴을 결정해서 사용하는 것이 바람직 함

디자인 패턴의 종류

디자인 패턴을 구체화해서 정리한 분류방식으론 GoF 디자인 패턴 이라는 것이 있음
GoF 디자인 패턴은
생성패턴 객체 생성에 사용되는 패턴으로, 객체를 수정해도 호출부가 영향을 받지 않게함
구조패턴 객체를 조합해서 더 큰 구조를 만드는 패턴
행위 패턴
객체 간의 알고리즘이나 책임 분배에 관한 패턴
객체 하나로는 수행할 수 없는 작업을 여러 객체를 이용해 작업을 분배 결합도 최소화를 고려할 필요가 있음 으로 나뉘어짐

생성 패턴

추상 팩토리 구체적인 클래스를 지정하지 않고 상황에 맞는 객체를 생성하기 위한 인터페이스를 제공하는 패턴
빌더 객체의 생성과 표현을 분리해 객체를 생성하는 패턴
팩토리 메서드 객체 생성을 서브클래스로 분리해서 위임하는 패턴
프로토타입 원본 객체를 복사해 객체를 생상하는 패턴
싱글톤 한 클래스마다 인스턴스를 하나만 생성해서 인스턴스가 하나임을 보장하고 어느 곳에서도 접근할 수 있게 제공하는 패턴

구조패턴

어댑터 클래스의 인터페이스를 의도하는 인터페이스로 변환하는 패턴
브리지 추상화와 구현을 분리해서 각각 독립적으로 변형캐 하는 패턴
컴포지트 여러 객체로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별 없이 다루는 패턴
데코레이터 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 하는 패턴
퍼시드 서브시스템의 인터페이스 집합들에 하나의 통합된 인터페이스를 제공하는 패턴
플라이웨이트 특정 클래스의 인스턴스 한 개를 가지고 여러 개의 가상 인스턴스를 제공할 때 사용하는 패턴
프락시 특정 객체를 직접 참조하지 않고 해당 객체를 대행(프락시)하는 객체를 통해 접근하는 패턴

행위패턴

책임 연쇄 요청 처리 객체를 집합으로 만들어 결합을 느슨하게 만드는 패터
커맨드 실행될 기능을 캡슐화해서 주어진 여러 기능을 실행하도록 클래스를 설계하는 패턴
인터프리터 주어진 언어의 문법을 위한 표현 수단을 정의하고 해당 언어로 구성된 문장을 해석하는 패턴
이터레이터 내부 구조를 노출하지 않으면서 해당 객체의 집합 원소에 순차적으로 접근하는 방법을 제공하는 패턴
미디에이터 객체의 상태 정보를 저장하고 필요에 따라 상태를 복원하는 패턴
메멘토 객처의 상태 정보를 저장하고 필요에 따라 생태를 복원하는 패턴
옵저버 객체의 상태 변화를 관챃라는 관찰자들 즉 옵저버 목록을 객체에 등록해 상태가 변할 때마다 메서드 등을 통해 객체가 직접 옵저버에게 통지하게하는 패턴
스테이트 상태에 따라 객체가 행동을 변경하게 하는 패턴
스트래티지 행동을 클래스로 캡슐화해서 동적으로 행동을 바꿀 수 있게 하는 패턴
템플릿 메서드 일정 작업을 처리하는 부분을 서브클래스로 캡슐화해서 전체 수행 구조는 바꾸지 않으면서 특정 단계만 변경해서 수행하는 패턴
비지터 실제 로직을 가지고 있는 객체가 로직을 적용할 객체를 방문하면 실행하는 패턴

5.REST API

애플리케이션에서 제공하는 인터페이스를 의미함 API를 통해 서버 또는 프로그램 사이를 연결할 수 있음 REST API는 REST 아키텍처를 따르는 시스템 애플리케이션 인테페이스임

REST의 특징

유니폼 인터페이스
일관된 인터페이스를 의미 REST 표준 서버는 HTTP 표준 정송 규약을 따르기 때문에 어떤 프로그래밍 언어로 만들어졌느냐와 상관 없이 플랫폼 및 기술에 종속되지 않고
타 언어 플랫폼 기술 등과 호환해 사용할 수 있다는 것을 의미함

무상태성

REST는 무상태성이라는 특징을 가짐 무상태성이란 서버에 상태 정보를 따로 보관하거나 관리하지 않는다는 의미
서버 클라이언트가 보낸 요청에 대해 세션이나 쿠키 정보를 별도 보관하지 않음 그렇기 대문에 한 클라이언트가 여러 요청을 보내든 여러 클라이언트가 하나의 요청을보내든
개별적으로 처리함 서버가 불필요한 정보를 관리하지 않으므로 비즈니스 로직의 자유도가 높고 설계가 단순함

캐시 가능성

REST는 HTTP 표준을 그대로 사용하므로 HTTP의 캐싱 기능을 적용할 수 있음 이 기능을 이용하기 위해서는 응답과 요청이 모두 캐싱 가능한지 명시가 필요하며
캐싱이 가능한 경우 클라이언트에서 캐시에 저장해두고 같은 요청에 대해서는 해당 데이터를 가져다 사용함
서버의 트랜잭션 부하가 줄어 효율적이고 사용자 입장에서 성능이 개선됨

레이어 시스템

REST 서버는 네트워크 상의 여러 계층으로 구성될 수 있음 그러나 서버의 복잡도와 관계없이 클라이언트는 서버와 연결되는 포인트만 알면 됨

클라이언트 - 서버 아키텍쳐

REST서버는 API를 제공하고 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계함 이구성은 서로에 대한 의존성을 낮추는 기능을 함

REST URI 설계 규칙

URI 규칙
URI의 마지막에는 /를 포함하지 않음
언더바(_)는 사용하지 않고 -하이픈을 사용함
URL에는 행위가 아닌 결과를 포함함
URI는 소문자로 작성해야함
파일확장자는 URI에 포함하지 않음

profile
초심자

0개의 댓글