본문 바로가기
빅데이터 부트캠프/Spring Framework

빅데이터 부트캠프 90일차

by Mecodata 2022. 11. 14.

Spring Framework

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

- DI(Denpendency Injection) = IoC Container가 개발자 대신 xml에 파일에 정의된 대로 bean 객체를 생성하고 의존성을 주입하는 것
- IOC(Inversion Of Control) Container = 사용자가 작성한 메타데이터(xml 파일 또는 어노테이션)에 따라 bean 클래스를 생성 및 관리 하는 Spring의 컴포넌트 (= Spring Container)

 

Spring Legacy Project

- Spring Legacy Project = Spring Framework의 일반적인 프로젝트
- Spring MVC Project = Maven과 여러 라이브러리가 세팅되어 생성되는 애플리케이션
- Maven = 자바 프로젝트의 빌드를 자동화해주는 도구

- pom.xml에 필요한 라이브러리를 정의하면 Maven이 해당 라이브러리와 사용 시 추가적으로 필요한 라이브러리들을 관리하고 네트워크를 통해서 자동으로 다운받아줌

- Maven Project는 설정에 대한 수정이 있을 경우 Run As - Maven Clean => Maven-Update Project 필수!
※ Spring Starter Project = Spring boot 기반

 

Spring 기본 세팅

- Spring Legacy Project - Spring MVC project 선택 후 생성 (HomeController.java 자동 생성됨)

- Spring에서는 eclipse처럼 외부 서버(Apache Tomcat)를 따로 import하지 않아도 알아서 자체적인 서버를 구동함

- porm.xml에서 java와 Spring Framework의 버전을 설정해줄 수 있음

 => Spring Framework 버전을 수정하면 자체적으로 버전이 변경되지만 java의 버전 변경시 Properties-Project Facets에서 java의 버전을 수정해줘야 함

 

bean

- Spring IOC Container가 관리하는 자바 객체 

- xml 파일에서 bean객체 생성시 Setter를 이용해 의존관계가 있는 bean을 주입할 때 <property> 태그 사용

- <property> 태그 안에서 name을 통해 값을 주입할 속성을 지정하고 ref를 통해 참조하여 속성에 넣을 값 지정

 

스프링 컨테이너(Spring Container)

- 스프링에서 자바 객체들을 관리하는 공간

- 스프링이 각 객체간 의존 관계를 관리하기 위하여 스프링 컨테이너(ApplicationContext)에 빈(bean)을 등록

 

- BeanFactory, ApplicationContext 두 종류가 존재하지만 ApplicationContext이 BeanFactory의 기능을 포함하고 있기 떄문에 ApplicationContext를 주로 사용함

ex) ApplicationContext context = new ClassPathXmlApplicationContext("step01.xml");

=> step01.xml에 있는 bean들을 ApplicationContext 객체인 context에 담음

 

- getBean(id, class) = 해당 id를 가진 빈(bean) 데이터를 지정한 class 타입의 인스턴스로 조회

ex) People p = context.getBean("p1", People.class); => id가 p1인 bean 객체를 People 객체로 반환하여 p에 저장

 

ApplicationContext 구현 클래스 종류

- ClassPathXmlApplicationContext : ClassPath에 위치한 xml 파일을 읽어 설정 정보를 로딩
- FileSystemXmlApplicationContext : 파일 경로로 지정된 곳의 xml 파일을 읽어 설정 정보를 로딩
- XmlWebApplicationContext : 웹 어플리케이션에 위치한 곳에서 xml파일을 읽어 설정 정보를 로딩
AnnotationConfigApplicationContext : @Configuration 어노테이션이 붙은 클래스를 이용하여 설정 정보로 로딩

 

Spring에서 자주 사용하는 어노테이션(Annotation)

- 대다수의 어노테이션은 주로 클래스 정의 코드 바로 위에 입력하는 편

 

- @Configuration = 스프링 설정 클래스를 선언하는 어노테이션
- @Bean = 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 bean으로 등록

@Component = 개발자가 직접 작성한 클래스를 bean으로 등록


- @ComponentScan = @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록

 <context:component-scan base-package= /> = base-package를 기준으로 어노테이션을 context에서 인식하도록 도와주는 설정 (@Autowired, @Qualifier 포함 모든 클래스) - @ComponentScan과 같은 기능

 <context:annotation-config /> = 이미 등록된 bean에 대해서만 어노테이션을 context에서 인식하도록 도와주는 설정 (@Autowired, @Qualifier만)

<context:component-scan> 입력시 <context:annotation-config> 입력할 필요 X

 

- @Controller = 해당 클래스가 컨트롤러 역할임을 지정

- @RestController = @Controller+@ResponseBody로 설정시 해당 클래스를 컨트롤러로 설정 및 해당 클래스의 모든 메소드들에 @ResponseBody가 적용되어 요청값을 프론트로 전송될 수 있도록 해줌

jsp, html 사용할 때는 @Controller, REST API로 프론트엔드를 사용할 때는 @RestController

(@RestController로 설정하면 html, jsp 파일 페이지를 열지 않고 텍스트(데이터)를 출력함)

 

- @CrossOrigin(origins={}) = 컨트롤러가 origins로 지정한 url 주소에서만 요청을 받도록 설정

- @Service = 해당 클래스가 서비스 역할임을 지정

 

- @Autowired = 의존성 주입 어노테이션 (new를 통해 따로 객체를 생성하지 않아도 자동으로 객체가 생성됨)

- @Qualifier = @Autowired시 해당하는 타입의 bean이 여러 개인 경우 의존성을 주입하고자 하는 특정 객체를 지정

 

- @RequestMapping = 웹에서 요청이 왔을 때, 경로(value=)와 메소드(method=) 설정 (method 입력 생략시 get 방식, post 방식 모두 가능)

- @GetMapping = @RequestMapping에서 method가 get인 경우

ex) @RequestMapping(value="/test", method= RequestMethod.GET = @GetMapping("/test") => GET 방식을 통해 온 요청을 /test로 전송 

※ @GetMapping이외에도 @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping이 존재

 

- @PathVariable = Mapping 어노테이션(Request,Put,Post,Get,DeleteMapping)의 URL경로 텍스트에서 특정 부분을 추출 

ex) @GetMapping("/urlTest.do/{id}")
      public String urlTest(@PathVariable String id) {} => URL에서 id를 추출하여 메소드에서 사용 가능

※ @PathVariable는 각 인자별로 적용

ex) @GetMapping("/urlTest2.do/books/author/{authorId}/book/{bookId}") 
      public String urlTest2(@PathVariable String authorId, @PathVariable int bookId) {}

 

- @RequestParam() = HttpServletRequest의 getParameter()와 같은 역할로 지정한 데이터의 값을 받아옴

 

- @ResponseBody = 클라이언트로 반환할 데이터를 알아서 JSON으로 변환후 전송 (@Controller로 클래스를 컨트롤러로 설정했을 경우 메소드에 @ResponseBody를 적용하지 않으면 결과값이 프론트로 전송되지 X)

- @RequestBody = 클라이언트에게 전송받은 JSON 데이터를 자바 객체로 변환후 매핑된 메소드 파라미터로 전달

 

※ 입력값을 받는 방법
@RequestBody로 프론트에서 보낸 JSON 데이터@PathVariable로 url에 입력받은 값을 받아올 수 있음

 

Controller 리턴 타입

- String 해당 JSP 파일명으로 이동
- void = 호출하는 URL과 동일한 이름의 jsp
- DTO 객체 = JSON 타입의 데이터로 변환 (해당 메소드 위@ResponseBody 입력 필수)
- Model, ModelAndView = 데이터 반환시 화면까지 지정하는 경우 
- ResponseEntity = 응답시, HTTP 헤더 정보와 내용을 가공
- HttpHeaders = 응답 내용 없이 HTTP 헤더 메세지만 리턴

 

Model

- 스프링에서 HttpServletRequest 역할 수행

- new로 객체를 직접 생성해줄 필요없이 파라미터로 입력하면 스프링이 알아서 인식

- addAttribute(이름, 데이터) = request.setAttribute() = 지정한 이름으로 데이터 저장 (name:value)

- 반환 타입이 String인 메소드에서 model.addAttribute를 한뒤 return으로 반환하는 String데이터에 해당하는 jsp파일로 model이 전송됨

- @ModelAttribute = 메소드 실행문에서 model 객체와 addAttribute()를 사용할 필요 없이 파라미터 설정에서 적용하여 model에 데이터 저장 가능하게 해주는 어노테이션

@RequestParam과 @ModelAttribute에서 ()를 사용하는 경우는 키와 필드명이랑 다를경우 사용  

=> 키와 필드명이 같으면 ()로 지정하지 않아도 자동 적용

ex) @RequestParam("id") String id = @RequestParam String id

 

- ModelAndView = model 객체와 해당 객체를 보낼 경로를 동시에 저장하여 지정한 경로로 저장한 model을 전송할 수 있는 타입 (Model과 달리 new로 직접 객체를 생성시켜줘야함)

- Model과 관련한 객체의 value를 jsp파일에서 조회할 때는 requestScope를 이용하여 조회 가능

 

ex) 다음 3개의 메소드는 모두 같은 기능을 수행

// 방법1 model 객체 및 @RequestParam 이용하여  
// model에 데이터를 담아 viewData.jsp로 전송
@RequestMapping(value = "/getData.do", method = RequestMethod.GET)
public String getData(Model model, @RequestParam String id) {
		model.addAttribute("id", id);
        return "viewData";
    }

// 방법2 model 객체 및 @RequestParam 대신 @ModelAttribute 이용하여 
// model에 데이터를 담아 viewData.jsp로 전송    
@RequestMapping(value = "/getData.do", method = RequestMethod.GET)
public String getData(@ModelAttribute String id) {	
		return "viewData";
	}

// 방법3 ModelAndView를 이용하여 addObject로 model에 데이터를 담고
// setViewName으로 model 객체를 보낼 jsp파일명(viewData) 설정후 
// ModelAndView 객체를 반환함으로써 model 객체를 viewData.jsp로 전송
@RequestMapping(value = "/getData.do", method = RequestMethod.GET)
public ModelAndView getData(@RequestParam String id) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("id", id);
		mv.setViewName("viewData");
		return mv;
	}

댓글