사진 출처: https://refactoring.guru/design-patterns/singleton

 

 

참고자료

 

 

 

클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴

 

 

# 싱글턴 패턴이란?

  • 인스턴스를 하나만 만들어 사용하기 위한 패턴
  • 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다.

 

커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러 개 만들게 되면

불필요한 자원을 사용하게 되고, 또 프로그램이 예상치 못한 결과를 낳을 수 있다.

 

 

 

싱글턴 패턴 구현을 위해 필요한 세 가지

  • new를 실행할 수 없도록 생성자에 private 접근제어자를 지정한다.
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.
  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.

 

 

 

Singleton.java

 

 

Client.java

 

 

 

 

# 싱글턴 패턴의 특징

  • private 생성자를 갖는다.
  • 단일 객체 참조 변수를 정적 속성으로 갖는다.
  • 단일 객체 참조 변수가 참조하는 단일 객체를 반환하는 getInstance() 정적 메서드를 갖는다.
  • 단일 객체는 쓰기 가능한 속성을 갖지 않는 것이 정석이다.

 

반응형

 

 

 

참고자료

 

 

# Dependencies 설정

 

 

위와 같이 build.gradle에 dependencies에 아래의 내용을 추가해줍니다.

 

implementation 'io.springfox:springfox-swagger2:2.9.2'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'

 

 

추가가 완료 되었으면 위 사진에 보이는 코끼리 버튼(빨간 박스 안)을 눌러줍니다.

 

 

* 여기서 제가 마주친 문제는 버전관련 문제였습니다.
최신버전인 3.0.0은 충돌로 인해서 다양한 문제가 있었습니다.

그리고 이유는 모르겠지만 2.9.2 버전을 사용해도 스프링 부트 2.6버전을 사용하면 에러가 발생 했었습니다.
현재 저는 스프링 부트 2.5.3 버전을 기본으로 스웨거를 세팅했습니다.

버전관련 문제는 스택오버 플로우를 보고 해결했습니다 => 링크

 

 

 

 

# config 패키지 안에 SwaggerConfig 파일 생성

 

위와같이 config 패키지에 SwaggerConfig 혹은 SwaggerConfiguration 파일을 만들어줍니다.

 

 

 

 

 

 

완료가 되면 위와 같이 코드를 추가해줍니다.

 

 

여기서 수정해야 할 부분은 

 

 

basePackage 부분을 자신의 프로젝트에 맞게 수정해줘야 합니다.

  .apis(RequestHandlerSelectors.any())

 

라고 작성해주면 패키지 부분을 따로 수정해주지 않아도 되는것 같지만 저는 제 패키지에 맞게 세팅해놨습니다.

 

 

 

 

 

 

apiInfo 부분은 말그대로 api 정보를 작성하는 곳입니다.

해당 작성하시는 API에 맞게 넣으주시면 될 것 같습니다.

 

 

 

# Controller 부분 수정

 

 

 

 

@Api(tags = { "Food"})

  • Controller를 대표하는 최상단 타이틀 영역에 표시될 값을 세팅합니다.

 

@ApiOperation(value = "레스토랑 음식 추가", notes = "해당 레스토랑에 음식 추가")

  • 각각의 resource에 제목과 설명을 표시하기 위해 세팅합니다.

 

 

 

# 문서화 된 결과를 보는 방법

 

http://localhost:8080/swagger-ui.html

 

 

전부 세팅을 하고 문제없이 돌아간다면 위의 URL을 브라우저에 입력하면 됩니다.

 

반응형

 

 

 

참고자료

  • 블로그 [기회는 찬스] => 링크
  • 블로그 [망나니 개발자] => 링크
  • 블로그 [seculoper] => 링크

 

 

 

 

 

# Spring에서 @Controller 란?

  • View에 표시될 데이터가 있는 Model 객체를 만들고 올바른 뷰를 선택하는 일을 담당한다.
  • @ResponseBody를 사용하여 HTTP Response Body에 데이터를 담아 요청을 완료할 수 있다.
    => HTTP Response Body에 데이터를 담는 것은 RESTful 웹 서비스에 대한 응답에 매우 유용(필요한 데이터만 반환)

Spring MVC 처리과정(간략하게)

 

  1. Client는 URI 형식으로 웹 서비스에 요청(Request)을 보낸다.
  2. Mapping 되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
  3. Controller가 요청을 처리한 후에 응답을 DispatcherServlet으로 반환하고, DispatcherServlet은 View를
    사용자에게 반환한다.

 

* @Controller가 View를 반환하기 위해 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링 한다.

 

 

 

# DispatcherServlet 이란?

  • DispatcherServlet은 Spring MVC의 중심이다.
    => 이것을 이해하면 Spring MVC를 이해하는 것과 같다.
  • Dispatch의 의미는 급파하다, 파견 등의 의미로, 해석하면
    받은 요청을 어딘가로 빨리빨리 보내는 서블릿이라는 뜻이다.
  • 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해준다.
    => 프론트 컨트롤러(Front Controller)라고 정의할 수도 있습니다.

 

-  프론트 컨트롤러란?
서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아 처리해주는 컨트롤러입니다

MVC 구조에서 함께 사용되는 디자인 패턴입니다.

 

 

 

# DispatcherServlet의 흐름

 

스프링 MVC에서는 Dispatcher Servlet이라는 모든 요청을 담당하는 서블릿을 두고 컨트롤러에 위임하여 요청 처리.

=> JavaEE로 웹서비스를 직접 구현할 때에는 Servlet 인터페이스의 구현체를 직접 만들어 사용했다고 한다.

 

* Java EE(Java Enterprise Edition) 에는 기업용 어플리케이션과 클라우드 애플리케이션 개발에 필요한

  복합적인 기술들이 정의되고 모여있다.

  =>Servlet, JSP(Java Server Page)은 Java EE에 포함된 하위 기술들이다.

 

 

ViewResolver란?

  • 사용자가 요청한 것에 대한 응답 view를 렌더링 하는 역할
    => view 이름으로부터 사용될 view 객체를 맵핑하는 역할
  • 스프링 부트에서는 view 이름만 적어주면 알맞은 view를 찾아 렌더링 해준다.
반응형

 

 

참고자료

  • 유튜브 채널[뉴렉처] => 링크
  • 블로그 [망나니 개발자] => 링크

 

 

 

# 스프링의 가장 기본적인 능력

  • 객체를 생성해주고, 그것을 조립해주는 능력

그 상황에서 나오는 용어가 DI (Dependency Injection)과 IoC (Inversion of Control) 입니다.

 

 

 

 

DI => 종속성 주입

 

위처럼 한글로 번역된 것이 더욱 DI를 이해하는데 어려움을 초래한다.

 

 

 

# DI는 부품 조립

  • 프로그램은 객체들의 조립 관계를 통해서 만들어진다.

 

Composition has a

  • A 라는 클래스가 b라는 클래스를 이요하고 있는 것.
    => 단순하게 클래스를 이용하는 것이 아니라, b를 객체화 해서 사용.

  • 일체형 has a 관계
    => 생성자를 사용해서 하는 방법

  • b는 A의 부품
    => 부품을 Dependency 라고 한다.(사전에서는 종속객체)

 

Association has a

  • A 클래스가 부품(b)를 생성하는 것이 아니라, 외부에서 생성
    => Setter 방식을 사용해서 해당 부품을 가져온다.
  • 조립형 (세팅이 필요)

 

 

# DI가 스프링을 중요하게 만든 이유

 

  • 느슨한 결합으로 조립형으로 만든다.
  • 기업에서 선호하는 방법
  • 일체형은 부품을 바꿀 수 없다.

  • 용어를 공부하기 보다는, 조립형으로 사용과 장, 단점을 바탕으로 개념 정리

 

 

# 조립형의 장, 단점

  • 장점: 부품을 쉽게 바꿀 수 있다.
  • 단점: 부품을 조립해야 하는 불편함이 있다.

 

 

# 다양한 DI(의존성 주입) 방법

https://mangkyu.tistory.com/125

 

[Spring] 다양한 의존성 주입 방법과 생성자 주입을 사용해야 하는 이유 - (2/2)

Spring 프레임워크의 핵심 기술 중 하나가 바로 DI(Dependency Injection, 의존성 주입)이다. Spring 프레임워크와 같은 DI 프레임워크를 이용하면 다양한 의존성 주입을 이용하는 방법이 ..

mangkyu.tistory.com

* 위 링크 블로그에 잘 정리되어 있습니다.

 

 

 

# 스프링을 사용하는 이유

  • 스프링이 객체 생성 및 조립(의존성 주입)을 하는데 도움을 준다. 
    => 스프링의 가장 기본적인 기능

  • 조립을 원하는 부품이 뭐가 있는지, 그것들이 어떤 결합을 하길 원하는지 설정해놓으면 스프링이 도와준다.
    => 우리는 조립된 결과물을 가져다가 사용하면 된다.

 

반응형

# POJO의 기원

포조는 Java EE 등으로 인해서 점점 무거워지는 객체에 대해서 반발하며 나타난 개념이다.

2000년 9월에 마틴 파울러(Martin Fowler), 레베카 파슨(Rebecca Parsons), 조쉬 맥킨지(Josh MacKenzie) 등이

시작하였으며 그 기원에 대한 내용은 마틴 파울러가 다음과 같이 말했다.

 

마틴 파울러

 

 

"We wondered why people were so against using regular objects in their systems and concluded that
it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely"

"우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데,
간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다.
그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고."

 

 

 

# POJO - Plain Old Java Object

  • 평범한 java Object,즉 자바개발자가 마음대로 정의 할수 있는 객체라는 뜻이다.
  • Object를 간단히 수퍼클래스로 둔 보통의 평범의 그자체 순수 자바클래스 라고 봐도 괜찮다.
  • 특정 규약에 종속되지 않는 자바 객체
  • POJO 는 가독성과 재사용성을 중요시하게 사용됩니다.

 

public class Animal {
        String dog;
        public String cat;
        private int legs;

        public Animal(String dog, String cat, int legs) {
            this.dog = dog;
            this.cat = cat;
            this.legs = legs;
        }

        public getDog() {
            return this.dog;
        }
    }

 

 

# 토비의 스프링에서의 POJO

 

그럼 특정 기술규약과 환경에 종속되지 않으면 모두 POJO라고 말할 수 있는가?
많은 개발자가 크게 오해하는 것 중의 하나가 바로 이것이다
. .. (중략)..
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라
재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.

 

 

# 정의

이상적으로, POJO는 Java 언어 규약에 의해 강제된 것 이외의 제한에 구속되지 않는 Java 오브젝트 입니다.

따라서 POJO는 다음과 같은 것을 해선 안됩니다.

 

  1. 미리 지정된 클래스를 extends 하는 것
public class Animal extends javax.servlet.http.HttpServlet { 
...
}

 

  1. 미리 정의된 인터페이스를 implement 하는 것.
public class Animal implements javax.ejb.EntityBean { 
...
}

 

  1. 미리 정의된 Annotation을 포함하는 것.
@javax.persistence.Entity
public class Animal { 
...
}

 

 

 

 

스프링의 핵심 : POJO

 

 

스프링 애플리케이션 = POJO를 이용해서 만든 애플리케이션 로직 + POJO가

어떻게 관계를 맺고 동작하는지 정의해놓은 설계정보

스프링의 주요 기술인 IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 기술들이다.

그래서 POJO의 개념은 무엇일까?

 

 

 

 

# 더 알아본다면?

POJO와 자바빈의 차이?

링크

  • JavaBeans는 특별한 POJO의 변형

 

 

반응형

 

참고자료

 

 

# 방법

위 사진과 같이

<input type="hidden" name="_method" value="PUT">

위 태그를 form 태그 하위에 추가 해주는 것입니다.

여기서 input 태그 value에 원하는 HTTP method를 추가해 주는 것입니다.

 

 

추가적으로 스프링 부트 2.2버전 이상은 자동으로 구성되지 않는다고 합니다.

application.properties 파일에 아래의 설정 값을 추가해주세요.

spring.mvc.hiddenmethod.filter.enabled=true

 

# HTML form 태그는 GET, POST만 지원한다.

 

해당 내용은 아래의 링크에 잘 정리되어있습니다.

 

REST - HTML Form에서 GET/POST만 지원하는 이유

연재 목록 REST - 긴 여정의 시작 REST - HTML Form에서 GET/POST만 지원하는 이유 REST - 논문(요약) 훑어보기 REST - REST 좋아하시네 REST - Roy가 입을 열다 REST - 당신이 만든 건 REST가 아니지만 괜찮아 REST -

haah.kr

 

반응형

+ Recent posts