참고자료

  • 토비의 스프링 3.1(저자 이일민) 53 ~ 54P

https://book.naver.com/bookdb/book_detail.nhn?bid=7006516 

 

토비의 스프링 3.1 세트

『토비의 스프링 3.1』은 스프링을 처음 접하거나 스프링을 경험했지만 스프링이 어렵게 느껴지는 개발자부터 스프링을 활용한 아키텍처를 설계하고 프레임워크를 개발하려고 하는 아키텍트에

book.naver.com


 

1️⃣ 스프링은 자바를 기반으로 한 기술이다.

  • 자바는 객체지향 프로그래밍이 가능한 언어
  • 자바 엔터프라이즈 기술의 혼란 속에서 잃어버렸던 객체지향 기술의 진정한 가치를 회복시키고,
    그로부터 객체지향 프로그래밍이 제공하는 폭 넓은 혜택을 누릴 수 있도록 기본으로 돌아가자는 것이 바로
    스프링의 핵심 철학이다.

 

 

2️⃣ 스프링을 이해하려면 오브젝트에 깊은 관심을 가져야 한다.

  • 스프링이 가장 관심을 많이 두는 대상은 오브젝트다.
  • 애플리케이션에서 오브젝트가 생성되고 다른 오브젝트와 관계를 맺고, 사용되고, 소멸하기까지의
    전  과정을 진지하게 생각해볼 필요가 있다.
    더 나아가서 오브젝트는 어떻게 설계돼야 하는지, 어떤 단위로 만들어지며 어떤 과정을 통해
    자신의 존재를 드러내고 등장해야 하는지에 대해서도 살펴봐야 한다.

 

 

3️⃣ 오브젝트에 대한 관심 ➡ 오브젝트 설계

  • 객체지향 설계(Object Oriented Design)의 기초와 원칙
  • 다양한 목적을 위해 재활용 가능한 설계 방법인 디자인 패턴
  • 좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업인 리팩토링
  • 오브젝트가 기대한 대로 동작하고 있는지를 효과적으로 검증하는 데 쓰이는 단위 테스트

 

3️⃣ 스프링은 객체지향 설계, 구현을 강요하지 않는다.

  • 하지만 오브젝트를 어떻게 효과적으로 설계하고 구현, 사용, 이를 개선해나갈 것인가에 대한 명쾌한 기준 마련
  • 객체지향 기술과 설계, 구현에 관한 실용적인 전략과 검증된 베스트 프랙티스를 평범한 개발자도 자연스럽고
    손쉽게 적용할 수 있도록 프레임워크 형태로 제공한다.

 

 

 

반응형

 

참고자료

  • 토비의 스프링 3.1(저자 이일민) 43 ~ 45P

 

 

토비의 스프링 책에 나오는 스프링을 효과적으로 학습하는 세 가지 단계를 정리해봤습니다.

 

 

 

1️⃣ 스프링의 핵심 가치와 원리에 대한 이해

  • 스프링의 핵심 가치를 이해하고, 스프링 스스로가 그 가치를 어떻게 적용해서 만들어져 있는지 이해한다.
  • 스프링에는 가장 중요한 핵심 가치와 그것이 가능하도록 도와주는 세 가지 핵심 기술이 있다.
    • IoC / DI
      - 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델.
      - 객체지향 설계 원칙과 디자인 패턴의 핵심 원리를 담고 있으며 프레임워크의 근간으로 삼고 있다.
      - 스프링이 직접 제공하는 모든 기술과 API, 심지어 컨테이너도 IoC/DI 방식으로 작성되어 있다.
    • 서비스 추상화
      - 이식성이 뛰어나다(서버, 특정 기술에 종속 되지 않는다.)
    • AOP
      - 애플리케이션 코드에 산재해서 나타나는 부가적인 기능을 독립적으로 모듈화 하는 프로그래밍 모델

 

 

2️⃣ 스프링의 기술에 대한 지식과 선택 기준 정립

  • 스프링의 본 원리를 확실하게 이해 후 이를 다양한 방법으로 확장하고 적용했는지 살펴볼 차례이다.
  • 스프링은 매우 범용적이고 애플리케이션의 모든 레이어를 폭 넓게 다루고 있다.
    => 그 중에서 어떤 것을 선택할지는 개발자의 몫이다.
  • 스프링이 제공하는 방법과 연동하는 프레임워크와 스타일을 사용할 것인지는 개발자에게 큰 고민이다.
    => 이런 고민을 피하고 남들이 만들어놓은 예제를 가져다가 생각없이 사용하는 일은 피해야 한다.
  • 두 번째 단계는 바로 이 다양한 선택의 문제를 각 기술영역별로 효과적으로 다루는 법을 배우는 것이다.
    => 먼저 스프링이 제공하는 기술의 종류와 접근 방법에는 어떤 것이 있는지 충분히 살펴보고,
    선택의 기준을 마련해서 그때그때 상황에 맞는 최선의 기술과 접근 방법을 선택 할 수 있어야 한다.

 

 

3️⃣ 스프링의 적용과 확장

  • 스프링의 다양한 기술을 어떻게 실제 애플리케이션 개발에 어떤 식으로 적용해야 하는지를 공부해야 한다.
    => 스프링은 특정 아키텍처에 제한되는 프레임워크가 아니다.
  • 스프링은 이전에는 기술적인 문제로 쉽게 적용하지 못했던 아키텍처도 마음껏 활용할 수 있게 도와준다.
    => 또한 스프링에 제공하는 기능을 그대로 사용하는 것 외에도 그것을 확장하거나 추상화해서 사용하는 방법을 알아야 한다.
    * 스프링을 효과적으로 사용하는 기업과 개발팀에서는 스프링을 기반으로 프레임워크를 만들어서 사용한다.
  • 스프링을 효과적으로 사용할 수 있도록 주어진 환경과 현재 프로젝트에 맞는 방식의 사용 기준을 마련하고, 이를
    틀(프레임워크)의 형태로 만들어서 개발자들이 이용할 수 있게 해주는 것이다.
    스프링의 자유도를 줄이고 각 현장의 상황에 맞는 접근 방법을 정립해주는 작업이라고도 볼 수 있다.
    때로는 스프링이 직접 지원 하지 않는 기술을 접목해서 사용하는 경우를 위해서 해당 기술을 스프링에 맞게 통합하는 작업도 포함된다.

 

 

 

반응형

 

참고자료

  • 토비의 스프링 3.1(저자 이일민)

 

스프링이란 무엇인가?

  • 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크다.
  • 애플리케이션 개발을 빠르고 효율적으로 할 수 있도록 애플리케이션의 바탕이 되는
    틀과 공통 프로그래밍 모델, 기술 API 등을 제공해준다.

 

 

1️⃣ 애플리케이션의 기본 틀 - 스프링 컨테이너

  • 스프링은 스프링 컨테이너 또는 애플리케이션 컨텍스트라고 불리는 스프링 런타임 엔진을 제공한다.
    - 스프링 컨테이너는 설정정보를 참고로 해서 애플리케이션을 구성하는 오브젝트를 생성 및 관리
    - 스프링 컨테이너는 독립적으로 동작할 수도 있지만 보통 웹 모듈에서 동작하는 서비스나 서블릿으로
      등록해서 사용

* 스프링을 사용하려면 먼저 스프링 컨테이너를 다루는 방법과 스프링 컨테이너가 애플리케이션 오브젝트를 이용할 수 있도록 설정정보를 작성하는 방법을 알아야 한다.

 

 

 

 

2️⃣ 공통 프로그래밍 모델 - IoC/DI, 서비스 추상화, AOP

프로그래밍 모델이란?

프레임워크가 애플리케이션을 구성하는 오브젝트가 생성되고 동작하는 방식에 대한 틀을 제공해주고,
애플리케이션 코드가 어떻게 작성돼야 하는지에 대한 기준을 제시해준다.

이런 틀을 프로그래밍 모델이라고 한다.

 

 

스프링이 제공하는 핵심 세 가지 프로그래밍 모델

 

  1. IoC/DI
    - 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델
    - 스프링은 유연하고 확장성이 뛰어난 코드를 만들 수 있게 도와주는 객체지향 설계 원칙과 디자인 패턴의 핵심 원리를 담고 있는 IoC / DI를 프레임워크의 근간으로 삼고 있다.
    - IoC / DI 방식을 따라서 작성돼야 스프링이 제공하는 가치를 제대로 누릴 수 있다.
    - 스프링이 직접 제공하는 모든 기술과 API, 심지어 컨테이너도 IoC / DI 방식으로 작성되어 있다.
      스프링을 바르게 이해하고 효율적으로 사용하는 데 기본이 되며 가장 중요한 기술이다.

  2. 서비스 추상화
    - 스프링이 사용하면 환경이나 서버, 특정 기술에 종속되지 않고 이식성이 뛰어나며 유연한 애플리케이션을 만들 수 있는데, 이를 가능하게 해주는 것이 바로 서비스 추상화다.
    - 구체적인 기술과 환경에 종속되지 않도록 유연한 추상 계층을 두는 방법이다.
  3. AOP
    - 애플리케이션 코드에 산재해서 나타나는 부가적인 기능을 독립적으로 모듈화하는 프로그래밍 모델이다.
    - 스프링은 AOP를 이용해서, 다양한 엔터프라이즈 서비스를 적용하고도 깔끔한 코드를 유지할 수 있게 해준다.|

 

 

3️⃣ 기술 API

  • 스프링은 엔터프라이즈 애플리케이션 개발의 다양한 역영에 바로 활용할 수 있는 방대한 양의 기술 API를 제공한다.
    - UI 작성은 물론이고 웹 프레젠테이션 계층, 비즈니스 서비스 계층, 기반 서비스 계층, 도메인 계층, 데이터 액세스 계층 등에서 필요한 주요 기술을 스프링에서 일관된 방식으로 사용할 수 있도록 지원해주는 기능과 전략 클래스 등을 제공한다.
  • 스프링이 제공하는 API와 지원 기술은 모두 스프링의 프로그래밍 모델에 따라 작성되어 있기 때문에, 이를 가져다 쓰는 것만으로도 스프링의 프로그래밍 모델을 코드에 자연스럽게 적용 할 수 있다.
  • 스프링의 모든 기술은 표준 자바 엔터프라이즈 플랫폼 (JavaEE)에 기반을 두고 있다.
    => 표준 기술과 더불어 유명 오픈소스 기술과 주요 상용 기술에 대한 지원 기능도 다양하게 제공된다.

 

 

 

프링을 사용한다는 것은 이 세 가지 요소를 적극적을 활용해서 애플리케이션을 개발한다는 뜻이다.

  • 클래스는 스프링 컨테이너 위에서 오브젝트로 만들어져 동작하게 만든다.
  • 코드는 스프링의 프로그래밍 모델을 따라서 작성한다.
  • 엔터프라이즈 기술을 사용할 때는 스프링이 제공하는 기술 API와 서비스를 활용하도록 한다.

 

반응형

 

목표

- 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

 

학습할 것

 

참고 자료

 

 

 

배열이란?

동일 타입의 값을 여러개 취급할 수 있는 기능

  • 인덱스라고 불리는 [] 로 감싼 0 부터 시작하는 정수를 사용하여 배열의 길이나 순서를 나타낼 수 있다.
  • 배열도 결국은 타입에 따라 default value로 채워진다.
    • 참조의 경우  => null
    • int / short / byte / long => 0
    • float / double => 0.0
    • bool => false
    • char => \u0000

 

 

 

 

 

 

반응형

참고자료

 

 

객체지향의 탄생 배경

  • 컴퓨터는 초창기에 미사일 실험과 같은 곳에서 사용 되었다. 그 과정에서 과학자들은 실제 세계와 유사한 가상 세계를 컴퓨터 속에 구현하고자 노력하였으며, 이러한 노력은 객체지향 이론을 탄생시켰다.
**"실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다"**

 

 

 

객체지향언어란

  • 객체지향언어는 기존의 것에서 다른것이 아닌 몇 가지 새로운 규칙을 추가한 발전된 형태의 것
  • 규칙들을 이용해서 코드 간에 서로 관계를 맺어 줌으로써 보다 유기적인 프로그램 구성

 

객체지향 언어의 주요 특징

**1. 코드의 재사용성이 높다.**
      => 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.

**2. 코드의 관리가 용이하다.**
      => 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.

**3. 신뢰성이 높은 프로그래밍을 가능하게 한다.**
      => 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
           코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

 

여기서 가장 큰 장점은 "코드의 재사용성이 높고 유지보수가 용이하다."는 것이다.

객체지향언어는 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선하였다.

 

 

어떻게 객체지향언어를 공부해야할까

너무 객체지향개념에 얽매여서 고민하기 보다는 일단 프로그램을 기능적으로 완성한 다음

어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지 고민하며 점차 개선해 나가는 것이 좋다.

⇒ 이론을 많이 안다고 해서 좋은 설계를 할 수 있는 것은 아니다.

번외 ⇒ 객체지향은 인간 지향이다.(링크)

 

클래스와 객체

**클래스의 정의** 클래스란 객체를 정의해 놓은 것이다.
**클래스의 용도** 클래스는 객체를 생성하는데 사용된다.

클래스는 '객체의 설계도 또는 틀'

 

객체란?

사전에서의 객체

객체(Object)의 사전적인 정의는, '실제로 존재하는 것'이다.

우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은 사물들이 곧 객체이다.

객체지향이론에서의 객체(Object)

사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.

프로그래밍에서의 객체

클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

**객체의 정의** 실제로 존재하는 것, 사물 또는 개념
**객체의 용도** 객체가 가지고 있는 기능과 속성에 따라 다름
**유형의 객체** 책상, 의자, 자동차, TV와 같은 사물
**무형의 객체** 수학공식, 프로그램 에러와 같은 논리나 개념

 

 

클래스와 객체의 관계

통상적으로 클래스설계도, 객체제품으로 설명한다.

 

  • 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다. 하나의 설계도만 만들어 놓으면 제품을 만드는 일이 쉬워진다.
  • 매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할지를 고민하지 않아도 된다.

클래스와 객체의 관계 결론

  • 클래스와 객체의 관계를 대략적으로 알고 코드로 구현해봐야 알 수 있다.
  • 객체지향언어의 규칙과 개념은 우선 외우고 뭔가 구현해보면서 대입해봐야 한다.
  • 클래스와 객체의 관계를 붕어빵 기계 붕어빵의 개념이 아니라고 하는게 있다. ⇒ 자바의 정석 저자님 말로는 붕어빵 기계와 붕어빵은 단순히 설명을 위한 예시
  • 붕어빵은 맛있다.

 

 

 

객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며,

어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.

ex) TV 클래스로부터 만들어진 객체를 TV클래스의 인스턴스라고 한다.

  • 객체: 소프트웨어 세계에 구현할 대상 ⇒ '클래스의 인스턴스'
    • 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고있다.
  • 인스턴스: 설계도 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
    • 어떤 클래스로부터 만들어진 것인지 강조하는 보다 구체적인 의미

 

객체의 구성요소 - 속성과 기능

객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며, 일반적으로 객체는 다수의 속성과 다수의 기능을 갖는다.

즉 객체는 속성과 기능의 집합이라고 할 수 있다.

그리고 객체가 가지고 있는 속성과 기능을 그 **객체의 멤버(구성원, member)**라 한다.

 

 

 

속성(property): 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

기능(function): 메서드(method), 함수(function), 행위(behavior)

 

 

 

 

 

 

 

객체 생성 후 메모리

 

 

메소드(Method)

  • 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.
  • 기본적으로 수학의 함수와 유사하다.
  • 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다.

메소를 사용하는 이유?

  1. 높음 재사용성(reusuability) ex) Java API에서 제공하는 메서드
  2. 중복된 코드의 제거 ⇒ 반복되는 문장들 대신 메서드 호출하는 한 문장으로 대체할 수 있다.
  3. 프로그램의 구조화 ⇒ 메인 메서드에 모든 코드를 작성하는게 아니라 분리해서 구조화 시킨다.

 

생성자(Constructor)

  • 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
  • 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.
  • 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값이 없다는 점이 다르다. ⇒ 그렇다고 해서 생성자 앞에 리턴값이 없음을 뜻하는 키워드 void를 사용하지 않는다.

 

  • 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다. ⇒ 기본 생성자(default constructor)
  • 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.
  • 객체 생성자 메서드라고도 불린다.

 

 

 

반응형

 

 

# 인터페이스란?

  • 일종의 추상클래스이다.
  • 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높다.
    => 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
         오직 추상메서드와 상수만을 멤버로 가질 수 있다.
  • 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려진 '기본 설계도'

 

interface 인터페이스이름 {
    public static final 타입 상수이름 = 값;
    public abstract 메서드이름(매개변수목록);
}

 

인터페이스 멤버들의 제약사항

  • 모든 멤버변수는 public static final ,이어야 하며, 이를 생략할 수 있다.
  • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
    => 단, static 메서드와 디폴트 메서드는 예외(JDK1.8부터)

 

 

interface PlayingCard {
    public static final int SPADE = 4;
    final int DIAMOND = 3;    // public static final int DIAMOND = 3;
    static int HEART = 2;        // public static final int HEART = 2;
    int CLOVER = 1;              // public static final int CLOVER = 1;

    public abstract String getCardNumber();
    String getCardKind();        // public abstract String getCardKind();
}
  • 인터페이스에 정의된 모든 멤버에 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며,
    편의상 생략하는 경우가 많다. 생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해준다.

 

 

 

# 인터페이스 구현

  • 인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없다.
  • 인터페이스는 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 한다.
  • 추상클래스는 확장한다는 의미의 키워드 'extends', 인터페이스는 구현한다는 의미의 키워드 'implements'
  • 인터페이스의 이름은 주로 Fightable과 같이 '~ 을 할 수 있는'의 의미인 able로 끝나는 경우가 많다.

 

class 클래스이름 implements 인터페이스이름 {
    // 인터페이스에 정의된 추상메서드를 구현해야 한다.
}


class Fighter implements Fightable {
    public void move(int x, int y)   {  /* 내용 생략 */ }
    public void attack(Unit u)       {  /* 내용 생략 */ }
}

 

 

 

# 인터페이스의 장점

  • 개발시간을 단축시킬 수 있다.
  • 표준화가 가능하다.
  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
  • 독립적인 프로그래밍이 가능하다.
    - 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.

 

 

 

반응형

 

 

 

참고자료

 

 

# 영속성

  • 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다.
  • 영속성을 갖지 않는 데이터는 메모리에서만 존재하기 때문에 프로그램을 종료하면 사라진다.

 

 

영구적인 객체(Object Persistence)

  • 메모리 상의 데이터를 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 영구적으로 저장하여 영속성을 부여한다.
  • 데이터를 데이터베이스에 저장하는 3가지 방법
    1. JDBC
    2. Spring JDBC (Ex. JDBC Template)
    3. Persistence Framework (Ex. Hibernate, Mybatis 등)

Persistence Framework

  • JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장한다.
  • Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다. Ex) JPA, Hibernate, Mybatis 등

 

 

# ORM이란?

  • Object-Relational Mapping 객체-관계 매핑
    • 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
    • 객체 모델과 관계형 모델 간에 불일치가 존재한다.
    • ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
  • 데이터베이스 데이터 ←—매핑—→ Object 필드
    • 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
  • Persistant API라고도 할 수 있다.
    • Ex) JPA, Hibernate 등

 

 

# Hibernate(하이버네이트)

  • 자바 환경에서의 객체-관계 모델 매핑 솔루션.
  • ORM이라 불리우는 객체-관계-매핑은 어플리케이션레벨의 도메인 객체를 관계형 데이터베이스 테이블의 형태로 혹은 역으로 매핑시켜주는 프로그래밍 기술.
  • JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용

 

 

 

# JPA(Java Persistence API)란?

  • 자바 퍼시스턴스 API 또는 자바 지속성 API 로 불린다.
  • 자바 플랫폼 SE자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 DB의 관리를 표현하는 자바 API
  • 기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술이다.
  • 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음
    - 실제로 동작하는 것이 아니다.
    - JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate라고 할 수 있다.

 

 

# EJB란?(더보기 클릭)

더보기
  • Java EE의 API 중 하나이고, 주로 웹 시스템에서 JSP로 화면을 구성하고 EJB는 비즈니스 로직을 처리한다.
  • EJB는 기업환경의 시스템을 구현하기 위해 위 스펙에 따라 비즈니스 로직을 처리하는 서버 어플리케이션이다.

 

단점

  • 객체 지향적이지 않ㄴ다.
  • 복잡한 프로그래밍 모델
  • 특정 환경, 기술에 종속적인 코드

개발 생산성을 위해 등장했으나 실제론 개발 생산성이 떨어지고 이동성이 부족하다.

 

 

 

 

 

 

 

 

 

# JPA의 동작 과정

  • JPA는 어플리케이션과 JDBC 사이에서 동작한다.
  • JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
  • 개발자가 ORM 프레임워크에 저장하면 적절한 INSERT SQL을 생성해 DB에 저장해주고,
    검색을 하면 SELECT SQL을 생성해 결과를 객체에 매핑하고 전달해준다.

 

 

 

# JPA를 사용해야 하는 이유

생산성

  • JPA를 자바 컬렉션에 객체를 저장하듯 JPA에게 저장할 객체를 전달.
  • INSERT SQL을 작성하고 JDBC API 사용하는 지루하고 반복적인 일을 JPA가 대신 처리해준다.
  • CREATE TABLE같은 DDL문 자동 생성
  • 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전

유지보수

  • 엔티티에 필드 추가시 등록, 수정, 조회 관련 코드 모두 변경
  • JPA를 사용하면 이런 과정을 JPA가 대신 처리
  • 개발자가 작성해야 할 SQL과 JDBC API 코드를 JPA가 대신 처리해줌으로 유지보수해야 하는 코드 수가 줄어든다.
반응형

 

사진 출처: 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를 찾아 렌더링 해준다.
반응형

+ Recent posts