Spring
회사에서 전자정부 프레임워크를 사용하기에 Spring을 공부하고 정리하려 합니다. 전자정부 프레임워크는 Spring과 다른 컴포넌트들로 이뤄져 있기 때문에, Spring 프레임워크의 기본 개념을 알고 있는 것이 편리할거라 생각합니다. Spring 프레임워크는 매우 방대하므로 키워드 별로 정리하고자 합니다. 제가 공부하고 이해한 것들을 정리한 내용이라 틀릴 수도 있습니다.
어노테이션, DI와 IOC
어노테이션은 코드 사이에서 주석처럼 쓰이면서 특별한 의미, 기능을 수행합니다. 컴파일러타임 또는 런타임에 작동합니다. 문법적인 오류를 잡거나, 런타임에 특정 기능을 실행하도록 합니다.
DI는 클래스 간 의존 관계에서 한 클래스가 다른 클래스의 객체를 생성하여 주입하는 것을 의미합니다. 이 때, 개발자가 객체를 주입하는 것이 아니라 외부에서 해당 객체를 주입하고 관리하는 것을 IoC라고 합니다. Spring에서는 스프링 컨테이너가 이러한 역할을 수행합니다. 그리고, 스프링 컨테이너에서 관리받는 객체를 빈 객체라고 합니다.
Bean
빈은 스프링 컨테이너가 관리하는 객체를 말합니다. 빈을 정의하는 방법으로는 크게 3가지인 Java 설정 클래스, XML 설정 파일, Component Scanning이 있습니다.
XML 설정 파일에는 ‘<bean>’ 요소를 사용합니다.
Java 설정 클래스에는 ‘@Configuration, @Bean’ 어노테이션을 사용하여 빈을 정의합니다.
마지막으로, Component Scanning은 ‘@Component’ 어노테이션을 사용하여 빈을 정의하고 ‘Java 설정 클래스에서 @ComponentScan 이나 xml 파일에서 ‘<context:component-scan>’ 을 사용하여 활성화합니다.
의존 주입과 의존 자동 주입
Java 설정 클래스 기반 빈으로 등록한다고 가정하고 의존 주입과 의존 자동 주입에 대해 정리하겠습니다. 기본적으로 @Bean을 등록할 때, 의존 객체를 명시적으로 주입해주어야 합니다.(이때, 생성자 방식과 세터 메서드 방식을 사용합니다) 하지만, ‘@Autowired’을 사용하면 자동적으로 의존 객체를 주입합니다. (이때, 생성자, 세터, 필드 방식을 사용합니다)
(주로 의존 자동 주입을 사용한다고 생각하면 될 것 같습니다.)
xml 설정 파일 기반 빈으로 등록한다면, 의존 객체의 주입은 생성자 방식과 세터 메서드 방식을 이용합니다. 생성자 방식은 constructor-arg 태그를 이용하고, 세터 방식은 property 태그나 p: 속성을 사용하면 됩니다.
서블릿과 스프링 컨테이너
서블릿 컨테이너인 아파치 톰캣은 서블릿을 생성하고 관리합니다. 이 서블릿은 주로 클라이언트로부터 요청을 받아들이고 처리하는 역할을 합니다. 그리고 이 서블릿이 스프링 컨테이너(servlet-applicationContext)를 생성합니다. 이 컨테이너에는 핸들러 맵핑, 핸들러 어댑터, 컨트롤러, 뷰 리졸버 등과 같은 스프링 MVC의 주요 구성 요소에 대한 빈들이 포함됩니다.
추가로, 또 다른 루트 스프링 컨테이너(root-applicationContext)가 있습니다. 이 스프링 컨테이너는 서블릿 스프링 컨테이너 외에 전역적으로 사용되는 빈들이 포함됩니다. 이러한 빈들은 여러 servlet-applicationContext에서 공유되거나 servlet-applicationContext의 범위를 넘어서 사용되는 경우에 유용합니다. 일반적으로 데이터베이스 연결, 서비스 계층의 빈, 보안 설정과 같은 전역적인 설정들이 정의됩니다.
servlet-applicationContext과 root-applicationContext는 설정 파일(xml)이나 설정 클래스(Java)로 설정하면 됩니다.
DAO, Service, Controller
Controller는 클라이언트의 요청이 들어오면, 실제 업무를 수행하는 Service를 호출하고 결과를 View에 전달합니다.
Service는 비지니스 로직을 수행하고, DAO를 이용해서 값을 처리합니다.
DAO는 DB에 접근하기 위한 클래스 또는 인터페이스입니다. orm프레임워크를 통해 매우 적은 코드로 구현 가능합니다.
컨트롤러
@ResponseBody(뷰 리졸버를 거치지 않음) 애노테이션 없이는 스프링은 String 리턴값을 view의 이름으로 받아들입니다. 직렬화/Marshal 기능을 해주어 객체를 자동으로 json 스트링으로 변환해줍니다.
@RequestBody어노테이션은 핸들러 어뎁터에 의해 MappingJacksonHttpMessageConverter이 json데이터를 Jackson라이브러리를 사용하여 model 객체로 변환해줍니다. (역직렬화/UnMarshal)
@ModelAttribute은 application/www-form-urlencoded 데이터를 받습니다.
MultipartHttpServletRequest를 사용해서 파일과 json 데이터를 받아올 수 있습니다.(의존라이브러리(fileuplad), 어플리케이션 컨텍스트 빈 등록(CommonsMultipartResolver)이 필요함)
ResponseEntity
### **Ajax** --- ajax는 서버에 요청을 날리고 리턴값을 받아 처리하기 때문에, 리턴 값이 필요없더라도 리턴 값을 해주어야 404에러를 피할 수 있습니다. datatType: 받을 데이터 형식 지정(json 지정시 자동으로 역직렬화), default는 MIME으로 확장자나 내용에 따라 결정됩니다. contentTpye: 보낼 데이터 형식을 지정합니다.(디폴트는 www-form-urlendcoed) FormData() → multipart/form-data: 모든 문자를 인코딩 하지 않음, 파일이나 이미지를 전송할 때 주로 사용됩니다. → MultipartHttpServletRequest (POST 요청에만), HttpServletRequest를 사용해도 데이터를 가져올 수 있음(if 파일이나 이미지가 없는 경우에는) serialize() → urlencode 형식 “key1=val1?key2=val2” serializeArray() → 객체 형식으로 변환 필요합니다.(serialObject 함수) JSON.stringify(): 직렬화(Marshal), JSON.parse(): 역직렬화(Unmarshal) complete 속성은 성공 여부와 관계없이 요청이 들어오면 항상 실행됩니다. 콜백함수: success(data,status,xhr), error(xhr,status,errorThrow), complete(xhr ,status) xhr은 xhr.responseText, xhr.status 속성을 가집니다. xhr은 XmlHttpRequest로 응답 정보가 저장됩니다. <에러> 보안권고로 인해 contetn-type이 “urlencoded”인 경우에는 GET, POST 로만 요청을 보낼 수 있고, 그 외의 PUT, DELETE의 경우 “json, xml” 과 같이 content-type을 지정해줘야 합니다.
### **Spring Boot** --- 스프링 부트는 최소한의 작업으로 스프링 프로젝트를 시작할 수 있도록 돕는다. 특히 Spring MVC 프로젝트의 경우, 톰캣과 같은 서버를 설치하지 않아도 내장 서버를 이용해서 웹 어플리케이션을 바로 실행할 수 있습니다. spring-boot-starter-web, @SpingBootApplication은 개발자의 많은 부분을 도와줍니다. 스타터 웹 모듈은 디스패처서블릿 등에 대한 설정을 자동 생성하는 기능을 제공합니다. @SpingBootApplication 어노테이션은 웹 관련 자동 설정 기능을 활성하하고, 컴포넌트 스캔 기능도 활성화합니다. xml 파일을 설정하는 대신 application.propertise를 이용해 root-context를 설정합니다. 에러>에러>