Spring FrameWork 기초

박지성 학부생·2023년 1월 21일
0

BackEnd Develop log

목록 보기
13/27

스프링 프레임워크란?

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

동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다. ( 출처 : 위키백과 )

  • 라이브러리

    • 라이브러리는 개발에 필요한 기능이 있을 때 직접 가져와 사용할 수 있도록 자주 사용되는 기능들을 모아 미리 구현해 둔 것이다.

    • 예를 들어 자바에서는 문자열을 사용할 때 String name = "박지성" ; 이렇게 사용한다. String은 java.lang.String 에 미리 만들어져있는 기능이고 우리는 java.lang.String 이라는 라이브러리에서 기능을 가져와 사용하는 것이다.

  • 프레임워크

    • 프레임워크도 개발에 필요한 기능이 미리 구현되어 있는 것이다. 하지만 프레임워크에는 라이브러리와 달리 기본 틀이 정해져있다. 때문에 제약없이 사용할 수 있는 라이브러리와 달리 프레임워크는 정해진 틀 안에서 미리 구현 된 기능을 사용해야한다.
    • 스프링 프레임워크에서는 MVC라는 정해진 구조 안에서 개발자가 프로그램을 개발한다.
  • 프레임워크, 라이브러리 차이


Spring MVC 구조란?

스프링 프레임워크는 MVC 구조로 이루어져있다.

  • MVC 구조란?

    • Model - View - Controller 의 약자
  • Spring의 MVC 구조를 살펴보면 아래와 같다.

    View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO

    • 각 구조에 대해 보면 크게 View, Controller, Service, DAO, DTO로 이루어져있다. 이 외에도 DispatcherServlet, servlet-context가 있지만 우선 위 구조만 살펴본다.

      • View
        말 그대로 사용자에게 보여지는 화면을 View라고 한다. Spring에서는 JSP를 통해 화면을 구성하고 Controller를 통해 백엔드 서버와 연결한다.
      • Controller
        View와 Service 사이를 연결한다. 클라이언트에서 입력한 URL에 맞는 View를 보여주고, View에서 처리하는 데이터를 Service로 전달해준다.

        @RequestMapping(value = "/") 
                 public String home() {
        	      service.method();
                     return "index"; 
                 } // localhost:port/로 접속한 클라이언트에게 index.jsp를 반환한다.
      • Service
        실제 로직을 처리하는 곳으로 모든 기능은 Service에서 만들어진다. Controller를 통해 화면과 연결되고, DAO를 통해 데이터베이스와 연결된다.
      • DAO
        Data Access Object의 줄임말인 DAO는 프로젝트와 데이터베이스를 연결한다. Mapper에 SQL을 명시한뒤 Mapper와 함께 데이터베이스와 데이터를 주고받는다.
      • DTO
        Data Transfer Object의 줄임말이고 VO(Value Object)라고도 불리는 DTO는 MVC 구조 사이사이에서 데이터 교환을 위한 오브젝트이다. 특이하게 getter/setter 두가지 함수만 가지고 있으며 주로 데이터베이스 테이블과 매칭된다.
        • DTO와 VO가 완벽하게 같은 말은 아니지만 크게 차이를 두진 않는다.

          public class temp { // 데이터베이스 테이블 컬럼과 GETSET만 가지고있다.
          
             private int id;
             private String name;
          
             public int getId() {return id;}
             public void setId(int id) {this.id = id;}
          
             public String getName() {return name;}
             public void setName(String name) {this.name = name;}
          }
  • Service - Serviceimpl / DAO - DAOimpl 은 무엇일까?
    impl은 implement의 줄임말로 Serviceimpl은 Service라는 인터페이스를 implements, DAOimpl은 DAO라는 인터페이스를 implements한 것이다.


interface와 impl을 나누어 설계하는 이유

  • IoC DI

    • IoC (Inversion of Control)
      IoC를 그대로 해석하면 제어의 역전이다. 무엇인가 제어하는 주체가 바뀐다는 의미인데 어떤 제어가 어떻게 바뀌는 것일까?

    • Spring을 사용해 본 사람이면 알듯이 Service, DAO 같은 객체를 사용자가 직접 생성(new)하지 않는다. @Autowired를 통해 받아 사용하는데 이 @Autowired가 IoC(제어의 역전)이다.

      // 기존 자바 프로젝트
      public class order {
      	private customer customer;
      	
      	public order() {
      		this.customer = new customer();
      	}
      }
      // Spring 프로젝트
      public class order {
      
      	@Autowired
      	private customer customer;
      }

스프링 컨테이너(IoC container)는 프로젝트에서 사용되는 객체들을 Bean으로 관리하고있고 @Autowired를 통해 객체를 주입해준다.

기존엔 사용자가 생성(new)해 파라미터로 다른 객체로 보내거나, 사용할 일이 없을 경우 객체를 소멸하는 등 객체에 대한 제어를 직접 진행했다. 하지만 Spring에서는 위처럼 제어를 사용자가 아닌 Spring Framework가 진행하기 때문에 제어의 역전이라고 표현한다.


Spring Bean

Spring에서 Bean은 스프링 프레임워크에 의해서 관리되는 자바 객체이다.

  • Spring Bean은 Java Bean과 다른 의미이다. (Java Bean vs Spring Bean 차이점)

    • DI (Dependency Injection)
      제 3자가 제어를 관리하는 순간 제어의 역전이고, 스프링이 생기기 전부터 있던 개념이었기에 IoC는 다른 프레임워크와 다른 스프링만의 차별점을 설명하기 부족했다. 그래서 스프링만의 차별점을 설명하기 위해 만들어진 개념이 DI이다.

    • DI는 Spring에서 IoC 구조를 만드는 방식이다.
      DI를 그대로 해석하면 의존성 주입이다. 의존성은 무엇이고 왜 주입할까? 프로그래밍에서 뜻하는 의존성은 객체간의 관계를 먼저 알아야 이해하기 쉽다.
      클래스 사이의 관계

    • DI를 사용하는 이유는 객체간의 의존성을 줄이기 위함이다. 밖에서 객체를 생성해 넣어주기 때문에 재사용성이 늘어나고 수정에 용이해진다.

      // 기존 자바 프로젝트
      class concept_api implements Post(){}
      class concept_Spring implements Post(){}
      class Blog_log() {
      private Post post; // 블로그 글 클래스
       public Blog_log() {
       	this.post = new concept_api();
      		this.post = new concept_Spring();
       }
      }
       // DI
       private Post post; // 블로그 글 클래스
      
         public Blog_log(Post post) {
         	this.post = new Post();
         }

만약 기존 프로젝트처럼 interface를 직접 만든다면 글마다 CRUD 함수가 필요하지만, DI처럼 의존성을 주입해 사용한다면 Blog_log 하나의 클래스 만으로 모든 글을 관리할 수 있다.

profile
참 되게 살자

0개의 댓글