객체지향이란?

객체 == 사물 == Object
객체의 3요소

  • 상태 유지
    상태정보를 저장, 유지
    속성은 변수로 정의
    속성값의 변경 -> 객체 상태의 변경

  • 기능 제공
    Method의 제공
    객체가 제공하는 Method를 통해 속성에 접근해 변경

  • 고유 식별자 제공
    고유한 값. Primary Key를 통해 객체의 유일성을 가짐

캡슐화
객체의 속성을 보호하기 위해 사용

Method 설계
Getter/Setter Method

CRUD Method

Business Logic Method

객체의 생명주기처리 Method
destroy(), disconnect(), quit() ?!

객체의 영구성 관리 Method

캡슐화

  • 무결성
    주로 변수는 private, Method는 public으로 선언
    Getter/Setter를 제외하고는 public method는 입력된 매개변수를
    validation 한 후에 실행

상속

  • 프로그램 구조에 대한 이해도 향상
  • 재사용성 향상
  • 확장성 향상
  • 유지보수성 향상

다형성
하나의 개체가 여러가지 형태로 변화
오버라이딩을 통해 가능

추상화
구체적인 공통적인 부분, 특성을 분리해 재조합

SOLID 원칙

결합도(coupling)는 낮추고, 응집도(cohesion)는 높여야 함

  1. SRP(Single Responsibility Principle) 단일 책임 원칙
    어떠한 클래스를 변경해야 하는 이유는 1가지 뿐이어야 함

  2. OCP(Open Closed Principle) 개방 폐쇄 원칙
    자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀있어야 함

  3. LSP(Liskov Substitution Principle) 리스코프 치환 원칙
    서브 타입은 언제나 자신의 상위 타입으로 교체할 수 있어야 한다.

  4. ISP(Interface Segregation Principle) 인터페이스 분리 원칙
    클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안됨

  5. DIP(Dependency Inversion Principle) 의존 역전 원칙
    자신보다 변하기 쉬운 것에 의존하지 말아야 함

POJO JAVA(Plain Old Java Object)

순수한 자바 오브젝트
1. 특정 규약에 종속 되지 않음
2. 특정 환경에 종속되지 않음

-> Spring, Hibernate
객체지향적인 설계, POJO 지향 프레임워크

Check
if/else, swithch 문 난무하고 있지 않은가?
책임과 역할이 다른 코드가 하나의 클래스에 다 들어가 있지 않은가?
절차지향적으로 한개의 파일에 모든 코드를 넣고 있지 않은가?
내가 만든 객체가 재사용 가능한가?

디자인 패턴

자주 사용하는 설계 패턴을 정형화 해 유형별로 가장 최적의 방법으로 개발을 할 수 있도록 함

Gof(Gang of Four) 디자인 패턴

생성 패턴

객체를 생성하는 것과 관련된 패턴
Factory Method, Prototype, Abstract Factory
Singleton, Builder, Chaining

구조 패턴

프로그램 내 자료구조나 인터페이스 구조 등 구조를 설계 관련된 패턴
Composite, Bridge, Flyweight
Adapter, Decorator, Facade, Proxy

행위 패턴

반복적으로 사용되는 객체들의 상호작용을 패턴화
Template Method, Interpreter, Iterator, Visitor, Chain of responsibility, Command, Mediator, State, Memento
Observer, Strategy

Singleton Pattern

어떠한 클래스가 유일하게 존재할 때 사용
ex) 실물세계 프린터, TCP Socket 통신에서 서버와 연결된 connect 객체
Spring bean 객체
자기 자신을 객체로 가지고 있어야 함
기본생성자를 통해 생성할 수 없도록 private
static method를 통해 getInstance 제공

Adapter Pattern

실생활 100v -> 200v로 변경 / 변환기
호환성이 없는 기존 클래스의 인터페이스를 변환해 재사용

Proxy Pattern

Proxy class를 통해 대신 전달하는 형태로 설계
실제 client는 proxy로부터 결과를 받는다
cache 기능으로도 활용 가능

Decorator Pattern

기존 뼈대(클래스)는 유지하되, 필요한 형태로 꾸밀 때 사용
확장이 필요한 경우 상속의 대안으로도 활용

Observer Pattern

변화가 일어났을 때, 미리 등록된 다른 클래스에 통보
eventlistener

Facade Pattern

Facade = 건물의 앞쪽 정면
여러 객체와 실제 사용하는 서브 객체 사이에 복잡한 의존관계가 있을 때, 중간에 facade 객체를 두고 여기서 제공하는 interface만을 활용해 기능을 사용

ex) FTP client

Strategy Pattern

유사한 행위들을 캡슐화, 전략만 변경해 유연하게 확장

Web 개론

web 3가지 요소 : URI, HTTP, HTML

REST(Representational State Transfer) - 네트워크 아키텍처

  1. Client, Server : 클라이언트 - 서버가 서로 독립적으로 분리

  2. Stateless : 요청에 대해 클라이언트의 상태를 서버에 저장 X

  3. Cache : 클라이언트는 서버의 응답을 임시저장 할 수 있어야 함, cache를 통해 응답을 재사용할 수 있어야 함

  4. 계층화(Layered System) : 서버와 클라이언트 사이에 다양한 계층 형태로 구성이 가능, 확장할 수 있어야 함

  5. 인터페이스 일관성 : 인터페이스의 일관성을 지키고, 클라이언트, 서버가 독립적으로 개선될 수 있어야 함

  • 자원의 식별
    웹 기반 REST에서는 리소스 접근을 할 때 URI를 사용
    ex) https://foo.co.kr/user(자원)/100(식별자)

  • 메시지를 통한 리소스 조작
    HTTP Header부분에 content-type을 통해 데이터 타입 지정

  • 자기 서술적 메시지

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

  • 애플리케이션 상태에 대한 엔진으로써 하이퍼미디어
    단순 요청에 대한 데이터만 응답하는게 아니라 관련된 리소스에 대한 Link 정보까지 같이 포함되어져야 한다.

    이러한 조건을 갖출 경우 RESTFul하다고 표현, REST API

  1. Code on Demand(optional) : 특정한 기능을 서버로부터 클라이언트가 전달받아 코드를 실행할 수 있어야 함

URI 설계 패턴

URI = Uniform Resource Identifier 인터넷에서 특정 자원을 나타내는 주소 값(응답은 달라질 수 있음)

URL = Uniform Resource Locator 인터넷 상에서의 자원이 어디에 위치하는지 식별하는 주소
URL은 URI의 하위 개념

  1. URI 설계 원칙
  • / 는 계층 관계를 나타내는데 사용
  • 마지막 문자로 / 는 포함 x
  • 하이픈(-) 은 URI 가독성을 높이는데 사용
  • 밑줄(_) 은 사용 X
  • URI 경로에는 소문자가 적합
  • 파일 확장자는 URI에 포함 X
  • 프로그래밍 언어에 의존적인 확장자를 사용 X
  • 구현에 의존적인 경로를 사용 X
  • 세션 ID 포함 X
  • 프로그래밍 언어의 Method명을 사용 X
  • 명사에는 복수형을 사용
  • 컨트롤러 이름으로는 동사 사용
  • 경로부분 중 변하는 부분은 유일한 값으로 대체(path variable)
  • CRUD 기능을 나타내는 것은 URI에 사용 X
  • URI Query Parameter
    컬렉션 결과에 대해 필터링
    컬렉션의 결과를 페이지로 구분
    ex) .../curriculums/web-master?chapter=2&page=0&size=10&sort=asc
  • API에 있어서 서브도메인은 일관성 있게 사용
  • 클라이언트 개발자 포탈 서브 도메인은 일관성 있게 만든다

HTTP Protocol

REST를 구현하기 위한 Method
GET, POST, PUT, DELETE
HEAD, OPTIONS, TRACE, CONNECT

응답의 상태를 나타내는 코드
1xx 처리중
2xx 성공
3xx 리다이렉트 - Response의 새로운 주소로 다시 요청
4xx 클라이언트 에러 - 클라이언트 요청에 에러
5xx 서버 에러 - 서버 처리중 에러

Spring Boot

Get API

@RestController // 해당 class는 REST API 처리하는 Controller
@RequestMapping("/api") // RequestMapping URI를 지정해주는 Annotation
public class ApiController {

    @GetMapping("/hello")   // http://localhost:9090/api/hello
    public String hello(){
        return "hello spring boot!";

    }
}

path-variable 활용

@GetMapping("/path-variable/{name}")    // http://localhost:9090/api/get/path-variable/{name}
public String pathVariable(@PathVariable(name = "name") String pathName){
   System.out.println("PathVariable : " + pathName);
   return pathName;
    }

query-param 활용

@GetMapping("query-param03")
    public String queryParam03(UserRequest userRequest) {
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAge());

        return userRequest.toString();

    }

0개의 댓글