Spring과 SpringBoot

Spring

정의

* 자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)
* 자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크
* 자바 개발을 위한 프레임워크로 종속 객체를 생성해주고, 조립해주는 도구
* POJO(Plain Old Java Object) BEAN CONTAINNER

특징

* 경량 컨테이너로 자바 객체를 직접 관리하기때문에 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
* 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크로 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
* 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
* 스프링은 의존성 주입(DI : Dependency Injection)을 지원하여 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
* 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다.
따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
* 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공하는 등 영속성과 관련된 다양한 서비스를 지원한다.
* 확장성이 높다. 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.

++ Plain Object Java Object : 기본적으로 사용자가 만들어낸 객체를 의미한다. 스프링은 사용자가 만들 객체들에 대해서도 라이프사이클 관리를 위임해서 수행하며, 이들의 조합으로 어플리케이션을 만들 수 있다.
++ AOP : 관점지향형 프로그램으로 사용자들이 트랜젝션 처리/로깅/예외 처리들의 로직을 공통으로 처리할 수 있는 기능을 지원하며 해당 기능을 잘 사용하면 비지니스로직와 기타 공통모듈이 섞이는 것을 방지하여 비지니스 로직에 집중할 수 있도록 한다.
++ DI : IoC 구현을 통해 의존관계 해결을 위한 디자인 패턴으로 xml 설정이나 애노테이션을 통해 의존성 주입을 쉽게 할 수 있는 방법을 제공한다.
++ IoC : 컴퓨터 프로그램의 사용자 지정 부분(프로그래머가 작성한 소스코드)이 프레임워크의 흐름제어를 받는 디자인 패턴이다.

Spring Boot

정의

어플리케이션을 개발하는데 있어서 필요한 라이브러리 의존성들을 안전성이 확인된 버전으로 조합하여 미리 준비된 구성으로 제공하며 MVC 환경을 만들거나 여기에 필요한 데이터베이스, 뷰 템플릿 등을 구성하는데 있어서 자동구성을 지원한다.
기본적으로 요구되는 요구사항들을 처리하기 위해 프로퍼티를 통한 설정값을 제어할 수 있도록 하고, 스프링부트를 시작하기 위해 XML 기반 설정파일이나 코드를 요구하지도 않는다.
내장된 웹서버를 이용해 별도의 웹서버 환경없이 즉시 단독으로 애플리케이션을 실행할 수도 있다. 이에 개발자들이 어플리케이션 로직 개발을 쉽게! 그리고 바로! 시작할 수 있다.

특징

* 어플리케이션의 기능적 요소 뿐만 아니라 임베디드 서버, 시큐리티, 외부 설정 연계등 개발의 모든 사이클을 제공한다.
* 로직에 집중 할 수 있도록 설정을 없앴다.

– 참고 :
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

Spring과 Springboot 차이

기존 spring framework가 기본적으로 해야할 셋팅이 너무 많고 어려웠던 점을 해소하기 위해 나온 것이 spring boot!

@RequestBody / @ResponseBody

@RequestBody : HTTP 요청의 body 내용을 자바 객체로 매핑한다.

@ResponseBody : 자바 객체를 HTTP 요청의 body로 매핑한다.

예제 : test.jsp

function test(){
        var rowData = $("#main_grid").getRowData();    
      
        var json = JSON.stringify(rowData) ;
        var jsonInfo = JSON.parse(json) ;
   
        var actionUrl = "/test/testList.do";
         
 
       
            $.ajax({
                type:"POST",
                dataType : 'json',
                data : json,
                url: actionUrl,
                processData : true /*querySTring make false*/,
                contentType : "application/json; charset=UTF-8",             
                
                success:function(result) {
                    var jsonResult = JSON.parse(JSON.stringify(result)) ;
                     
                    if(jsonResult.result == "success" ) {
                        alert(jsonResult.resultMsg) ;                        
                          
                    } else if (jsonResult.result == "failure" ) {
                        alert(jsonResult.resultMsg) ;
                        return false ;
                    }
                },
                complete : function () {
                },               
                error: AjaxError
            }) ;
       
     } else {
            return false;
        }       
    }

$(“#main_grid”) 라는 jqGrid에서 getRowData()를 통해 전체 Row를 가져왔다.
그 후 Json형식으로 변환한 뒤 파라미터로 던져주었다.

test.java

 

@RequestMapping("/test/testList.do")
 @ResponseBody
 public Object testList(HttpServletRequest request, @RequestBody List> list) throws Exception {
  Map  resultMap =  new HashMap();
   
  String result = "";
  String resultMsg = "";
   
  try {  
   for(Map tList : list) {
    aVO authVO = new AuthVO() ;
     
    aVO.setUse_auth(tList.get("use_auth").toString());
    aVO.setMenu_id(tList.get("menu_id").toString());
    aVO.setUse_yn(tList.get("use_yn").toString());
 
    authMgmtService.mergeAuthMgmtList(aVO) ;
   }
    
   result = "success";
   resultMsg = "성공" ;
    
  } catch (Exception e) {
   result = "failure";
   resultMsg = "실패" ;
  }
   
  resultMap.put("result", result);
  resultMap.put("resultMsg", resultMsg);
   
  return resultMap;
 }

전송 된 파라미터를 List> 형식으로 받아온다. 앞에 @RequestBody를 쓰면 그대로 list에 매핑되어진다.
그리고 list의 size만큼 for문을 실행하는데 aVo라는 vo객체를 하나 생성해서 list에서 받아온 map의 value값을 넣어준다.
작업을 수행한 뒤 result와 resultMsg를 resultMap에 담아 리턴한다. @ResponseBody를 명시했기 때문에 응답데이터에 Map객체가 매핑되어 전달된다.

@Autowired

의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 그러므로 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.

options:

required: Autowired 어노테이션을 적용한 프로퍼티 중 반드시 설정할 필요가 없는 경우에 false값을 주어 프로퍼티가 존재하지 않더라도 스프링이 예외를 발생하지 않도록 한다. 기본값은 TRUE. ex) @Autowired(required=false)
사용하려면 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 태그를 사용해도 된다.

@Autowired를 적용할 때 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다. 이럴 때 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.

public class SpringTest {
      private SpringTestService service; 

     @Autowired public void setSpringTestService(SpringTestService service){
                 this.service = service;
      }
 }