day 01

유요한·2022년 11월 23일
1

Spring

목록 보기
1/15
post-thumbnail

프레임워크란?

뼈대나 근간을 이루는 코드들의 묶음
개발자는 각 개개인의 능력차이가 큰 직종이고, 개발자 구성에 따라 프로젝트 결과 역시 큰 차이를 낳는다. 이런 상황을 극복하기 위한 코드의 결과물이 바로 프레임워크이다.

프로그램의 기본 흐름이나 구조를 정하고 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발하게 된다. 뼈대나 근간을 이루는 코드들의 묶음. 객발자는 각 개개인의 능력차이가 큰 직종이고, 개발자 구성에 따라 프로젝트 결과 역시 큰 차이를 낳는다. 이런 상황을 극복하기 위한 코드의 결과물이 바로 프레임워크이다. 프로그램의 기본 흐름이나 구조를 정하고 모든 팀원들이 이 구조에 자신의 코드를 추가하는 방식으로 개발하게 된다.

프레임워크의 장점

개발에 필요한 구조를 이미 코드로 만들어 놓았기 때문에, 실력이 부족한 개발자라도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다. 회사 입장에서는 프레임워크를 사용하면 일정한 품질이 보장되는 결과물을 얻을 수 있고, 개발자 입장에서는 완성된 구조에 자신이 맡은 개발해서 넣기 때문에 개발 시간을 단축할 수 있다.


스프링 프레임워크

  • 경량 프레임워크(light-weight)

  • 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크

  • 예전 프레임워크는 다양한 경우를 처리할 수 있는 다양한 기능을 가지도록 만들다 보니 하나의 기능을 위해서 너무 많은 구조가 필요했다. 기술이 너무나 복잡하고 방대하기 때문에 전체를 이해하고 개발하기에는 어려움이 많았다. 그래서 스프링 프레임워크가 등장했고, 특정 기능을 위주로 간단한 JAR파일 등을 이용해서 모든 개발이 가능하도록 구성되어 있다.

    JAR

    JAR는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다.

    학습목표
    스프링 프레임워크를 이용해서 의존성 주입에 대한 이해와 테스트 스프링에서 XML을 이용하는 객체 관리 방법 스프링의 JUnit 테스트 환경 구축 스프링 MVC 모델에 대한 이해와 구현

스프링 프레임워크의 장점

  • 복잡함에 반기를 들어서 만들어진 프레임워크
  • 프로젝트 전체 구조를 설계할 때 유용한 프레임워크
  • 다른 프레임워크들의 포용(여러 프레임워크를 혼용해서 사용가능)
  • 개발 생산성과 개발도구의 지원

스프링 프레임워크의 특징

  • POJO 기반의 구성
  • 의존성 주입(DI)을 통한 객체 간의 관계 구성
  • AOP(Aspect-Oriented-Programming)지원
  • 편리한 MVC 구조
  • WAS의 종속적이지 않은 개발 환경

POJO(Plain Old Java Object) 기반의 구성

  • 오래된 방식의 간단한 자바 객체
  • Java 코드에서 일반적으로 객체를 구성하는 방식을 스프링에서도 그대로 사용할 수 있다는 말이다.

장점

  • 객체지향적인 설계를 자유롭게 적용할 수 있다. 그렇기 때문에 언제든지 재활용할 수 있다.
  • POJO로 개발된 코드는 자동화된 테스트에 매우 유리하다.
  • 특정 기술과 환경에 종속되지 않은 오브젝트는 재사용이 가능하며 유연하게 확장할 수 있는 코드를 작성할 수 있다.
  • 특정 종속 코드를 작성하지 않기 때문에 간결한 코드를 작성할 수 있고 테스트를 단순하게 진행할 수 있다.

"진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트이다"


의존성 주입(DI)을 통한 객체 간의 관계 구성

DI

DI란 말그대로 의존성 주입이다.

의존성(Dependaency)이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미한다. 예를 들어 A객체가 B 객체 없이 동작이 불가능한 상황을 A가 B에 의존적이다 라고 표현한다.

주입(Injection)은 말 그대로 외부에서 밀어 넣는 것을 의미한다. 예를 들어 어떤 객체가 필요로 하는 객체를 외부에서 밀어 넣는 것을 의미한다. 주입을 받는 입장에서는 어떤 객체인지 신경쓸 필요가 없고 어떤 객체에 의존하든 자신이 하던 역할은 변하지 않게 된다. 필요할 때만 주입을 통해서 넣는 것이다.

*의존
ⓐ → ⓑ
a 객체에서 b 객체를 직접 생성

*의존성 주입
ⓐ → ???? ← ⓑ
a가 b를 필요로 한다는 신호를 보내고, b 객체를 주입하는 것은 
외부에서이루어짐

의존성 주입방식을 사용하기 위해서는 ???라는 존재가 필요하게 된다. 스프링 프레임워크에서는 ApplicationContext가 ???라는 존재이며, 필요한 객체를 생성하고 주입까지 해주는 역할을 한다. 따라서 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고, 이러한 객체들을 엮는(Wiring) 작업의 형태로 개발하게 된다.

ApplicationContext가 관리하는 객체들을 빈(Bean)이라 부르고, 빈과 빈 사이의 의존 관게를 처리하는 방식으로 XML, Java 코드, 어노테이션 방식을 이용할 수 있다.

DI 사용 장점

  • 객체 간 결합도를 낮춘다.
  • 유연한 코드 작성 가능
  • 가독성 증가
  • 코드 중복 방지
  • 유지보수가 용이
  • 기존에는 개발자가 직접 객체의 생성과 소멸을 제어했는데 DI로 인해 객체의 생성과 소멸 등 클래스간 의존관계를 스프링 컨테이너가 제어
  • DI는 객체의 생성, 소멸, 의존 관계를 개발자가 직접 설정하는 것이 아니라 XML이나 어노테이션을 통해 스프링 프레임워크가 제어
  • 기존에는 개발자가 직접 객체를 생성해줬던 반면에 스프링 프레임워크에서는 객체의 제어를 스프링이 직접 담당해주는 IoC 특징을 가진다

AOP의 지원

Aspect Oriented Programing : 관점지향언어
관점 지향 프로그래밍

좋은 개발환경에서는 개발자가 비즈니스 로직에만 집중할 수 있게 한다. 스프링 프레임워크는 반복적인 코드를 제거해줌으로써 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공한다. 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만 반드시 처리가 필요한 횡단 관심사(cross-concern) 라고 한다. 스프링 프레임워크는 이러한 횡단 관심사를 분리해서 제작하는 것이 가능하고 횡단 관심사를 모듈로 분리하는 프로그래밍을 AOP라고 한다. 이를 통해 3가지의 이점이 생긴다.

1) 핵심 비즈니스 로직에만 집중하여 코드 개발
2) 각 프로젝트마다 다른 관심사를 적용할 시 코드 수정 최소화
3) 원하는 관심사의 유지보수가 수월한 코드 구성이 가능


트랜잭션의 지원

DB 작업시 트랜잭션 관리를 매번 상황에 맞게 코드로 작성하지 않고, 어노테이션이나 XML로 트랜잭션 관리를 설정할 수 있다.

트랜잭션

데이터베이스의 상태를 변경시키기 위해 수행하는 작업이다. 이러한 트랜잭션은 상황에 따라 여러개 만들어질 수 있다.

  • 트랜잭션의 특징



어노테이션

  • 자바 어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @를 앞에 붙여서 사용한다. 자바 어노테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.

→ 예전에는 자바 코드와 설정 파일을 따로 두고 저장하고 관리했지만 이와 같은 경우는 두 가지의 어려움이 있다. 첫째는 자바 코드는 변경하는데 설정파일을 업데이트 하지 않는 어려움과 두 번째는 설정과 코드가 나뉘어 있어서 개발이 어렵다. 그래서 다음과 같은 관리방법을 채택했다.

이렇게 하면 하나의 파일에서 코드와 설정을 관리할 수 있게 된다.

어노테이션의 종류

  1. @Override
    오버라이딩을 올바르게 했는지 컴파일러가 체크한다.
    Override는 오버라이딩할 때, 메서드의 이름을 잘못적는 실수를 방지
  1. @Deprecated
    앞으로 사용하지 않을 것을 권장하는 필드나 메소드에 붙인다.
  1. @SuppressWarnings
    컴파일러의 경고메세지가 나타나지 않게 한다. 보통 경고가 많을 때, 확인된 경고는 해당 어노테이션을 붙여서 새로운 경고를 알아보지 못하는 것을 방지하기 위해 사용한다.

  2. @Component
    @Component 어노테이션은 클래스에 선언하는 어노테이션이다. 이 어노테이션을 선언해주는 것만으로도 해당 클래스를 스프링 빈(bean) 객체로 사용할 수 있다. Spring MVC역시 Spring context에서 동작하기 때문에 사용할 모든 클래스를 빈으로 등록해야 할 필요가 있다. Controller 역할을 하는 클래스 역시 마찬가지다.

  3. @Controller
    @Controller는 Controller 클래스에 붙이는 것이다. Controller 클래스는 클라이언트와의 요청, 응답을 주고 받는 역활을 한다. 전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다.

이 역활을 수행하기 위해서 Controller 클래스는 최소 두 가지의 조건을 만족시켜야 한다.

  1. HttpServlet의 기능을 수행해야 할 것.
  2. url(호출)-클래스(서버)-화면(응답)이 서로 연결되어야 할 것.

이 두가지 기능과 함께 @Controller@Component@RequestMapping의 역할을 모두 할 수 있다.

정확하게 말하자면 이 두 가지 기능을 수행하는 것은 @Controller만 할 수 있는 것은 아니다. @RequestMapping가 이 두 가지 기능을 할 수 있고 @Component가 해당 클래스를 스프링 빈으로 생성할 수 있게 해주는 것이다.

즉, @Component + @RequestMapping = @Controller다.

  1. @Service

비즈니스 로직을 담당하는 서비스 클래스임을 의미하게 해준다.

  1. @RestController

RestController는 Controller에서 @ResponseBody 어노테이션이 붙은 효과를 지니게 됩니다. 즉, 주용도는 JSON/XML형태로 객체 데이터 반환을 목적으로 합니다.

  1. @InitBinder

파라미터의 수집을 다른 용어로는 binding(바인딩)이라고 합니다. 변환이 가능한 데이터는 자동으로 변환되지만 경우에 따라서는 파라미터를 변환해서 처리해야 하는 경우도 존재합니다. 예를 들어, 화면에서 '2018-01-01'과 같이 문자열로 전달된 데이터를 java.util.Data 타입으로 변환하는 작업이 그러합니다. 스프링 Controller에서는 파라미터를 바인딩할 때 자동으로 호출되는 @InitBinder를 이용해서 이러한 변환을 처리할 수 있습니다.

TodoDTO.java

package com.example.domain;

import lombok.Data;

import java.util.Date;

@Data
public class TodoDTO {
    private String title;
    private Date dueDate;
}

TodoDTO에는 특별하게 dueDate 변수의 타입이 java.util.Date 타입입니다. 만일 사용자가 2018-01-01과 같이 들어오는 데이터를 변환하고자 할 때 문제가 발생하게 됩니다. 이러한 문제를 해결하는 방법이 @InitBinder를 이용하는 것입니다.

SampleController.java

    @InitBinder
    public void initBinder(WebDataBinder binder) {
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
      binder.registerCustomEditor(java.util.Date.class, new CustomBooleanEditor(dateFormat, false));
  }
  1. @DateTimeFormat

파라미터로 사용되는 인스턴스 변수에 @DateTimeFormat을 적용해도 변환이 가능합니다. 이 어노테이션을 사용하는 경우 @InitBinder는 필요하지 않습니다.

TodoDTO

package com.example.domain;

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Data
public class TodoDTO {

    private String title;

    // 이 어노테이션을 사용하면 @InitBinder을 안써도 된다.
    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date dueDate;
}

SampleController

   @GetMapping("/ex06")
    public String ex06(TodoDTO todo) {
        log.info("todo : " + todo);
        return "ex06";
    }

STS(Spring Tool Suite) 설치

방법1:
eclipse 플러그인으로 설치
Help > Eclipse Marketplace > STS 검색 > Install
Next > ... > 경고창 뜨면 Install Anyway 클릭
(알수없는 창이 뜬다면 무지성 동의 후 next) > Restart Now
방법2:

profile
발전하기 위한 공부

0개의 댓글