본문 바로가기
수업내용

20230616 수업내용2🤦‍♂️🤦‍♂️🤦‍♂️

by titlejjk 2023. 6. 16.

2교시는 Spring수업이다.

Project의 기본 구조를 알아보겠다.

프로젝트 아이콘에 M이라는 이니셜은 Maven project라는 뜻이다. maven은 java buid system인데 이 빌드 시스템은 ant, maven, gradle등등이 있다. 이클립스에는 ant라는 빌드  시스템을 사용했다. ant빌드 시스템을 사용할 때는 직접 다운 받거나 만들어서 사용했는데 maven이나 gradle은 다운 받을 필요없이 pom.xml에 무엇이 필요한지 명시만 해주면 자동으로 다운 받아준다. 그러면 자동으로 사용할 준비를 해준다.

maven을 사용할 때는 그냥 사용하는 것이 아니라 설치 및 설정도 해주어야한다. 우리가 설치한 maven을 이클립스가 끌어다 쓰는 것이다. maven의 특징은 pom.xml이 있다. 어떤 라이브러리가 필요하고 해당 라이브러리는 어떤 버전이 필요한가도 알아야 한다. pom.xml은 일반적인 환경을 구성해주고 사용해 주어야 한다.

이미 다운 받아져있는 Library들

기존에는 필요한 라이브러리가 있으면 .jar를 다운받아서 사용했지만 이제 필요한 라이브러리가 있다면 https://mvnrepository.com/ 에서 필요한 라이브러리를 검색해서 주소를 복사해 pom.xml에 붙여넣어주면 된다.

web.xml은 Tomcat WebServer App이 읽어 들여서 loading해서 동작을 준비한다.  개발자의 의도에 맞게끔 톰캣서버가 동작하도록 하려면 이 web.xml에 동작을 설정해주면된다.

 

pom.xml은 프로젝트의 자체 셋팅 web.xml은 서버(톰캣)의 구동을 위한 셋팅 이런 개념이다.

스프링이 사용할 서블릿을 DispatcherServlet여기에 준비하고 " / " 컨텍스트 하위에 있는 모든경로에서 DispatcherServlet이 요청을 받겠다라는 의미이다. 어떤 요청이든 다 DispatcherServlet을 거치게 된다. 이 서블릿도 우리가 만들 것이 아니기 때문에 이 서블릿의 동작을 개발자환경에 맞게 끔 수정하려면 servlet-context.xml에서 고치면 된다.

java에서 bean은 객체를 뜻한다. 

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

자바스크립/css/이미지관련 들을 받아가기 위한 요청들도 존재하겠지만 이것들은 DispatcherServlet를 거쳐가진 않는다.

모든 요청은 DispatcherServlet를 거치고 이 DispatcherServlet가 Controller에서 실행해준다. 요청받은 데이터는 request에 담아서 해당 페이지로 forward 이동한다.

 

스프링에서는 ui를 전달하는 경로이기 때문에 view page라고도 한다.

 

 

 

 

 

 

개발자는 어떤 키값으로 어떤 데이터를 담고 이동했는지 기억하는 것이 좋다.

 

 

새로운 프로젝트를 만들어보겠다.

com.gura.step01 이렇게 작성하면 컨텍스트 경로가 /step01이된다.

프로젝트를 처음만들면 설정을 먼저 해줘야한다.

먼저 pom.xml에 들어가서 java 버전 설정을 해준다.

그 다음 추가 의존 lib를 문자열로 추가를 하였다.

<!-- 추가 의존 라이브러리 -->
      <!-- MyBatis 라이브러리 -->
        <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.2.8</version>
      </dependency>
        <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis-spring</artifactId>
         <version>1.2.0</version>
      </dependency>
      <!-- Spring JDBC 라이브러리 -->
        <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>4.0.0.RELEASE</version>
      </dependency>
      <!-- 파일업로드 처리를 위한 라이브러리 (SmartEditor 에서도 필요함)-->
        <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
         <version>2.4</version>
      </dependency>
        <dependency>
         <groupId>commons-fileupload</groupId>
         <artifactId>commons-fileupload</artifactId>
         <version>1.3.1</version>
      </dependency>                  
      <!--  json, xml 응답을 편하게 할수 있도록 도와 주는 라이브러리 -->
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.6.0</version>
      </dependency>
      <!-- Aop 용 라이브러리 -->
        <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-aop</artifactId>
         <version>4.0.0.RELEASE</version>
      </dependency>
        <dependency>
         <groupId>org.aspectj</groupId>
         <artifactId>aspectjweaver</artifactId>
         <version>1.8.0</version>
      </dependency>
        <!-- Spring Security 관련 라이브러리 -->
        <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-web</artifactId>
          <version>4.0.0.RELEASE</version>
      </dependency>
      <!-- 트렌젝션 처리를 위한 라이브러리 -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>4.0.0.RELEASE</version>
      </dependency>
        <!-- 오라클 라이브러리 -->
      <dependency>
          <groupId>com.oracle.database.jdbc</groupId>
          <artifactId>ojdbc8</artifactId>
          <version>21.1.0.0</version>
      </dependency>

자바 버전 스프링 버전 메이븐 버전 그리고 라이브러리를 추가해주었다.

아직도  Java가 1.6이다 이걸 해결하려면

아래처럼 바꿔주면 된다.

 

 

 

 

 

 

 

 

새로운 MemberController를 만들어 보았다.

@Controller 어노테이션을 붙여주었다. 스프링은 런타임시에 어노테이션이 붙은 클래스를 변경(수정)을 통해 컴파일 해서 사용한다.

이 다음으로 "/member/insertform" 요청을 처리할 메소드를 만들어준다.

package com.gura.step01.member;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MemberController {
	// "/member/insertform"요청을 처리할 메소드 만들기
	
	//접근지정자
	@RequestMapping("/member/insertform")
	public String insertform() {
		//응답할 jsp 페이지의 위치를 리턴해준다.
		return "member/insertform";
	}
}

이 다음 이를 실행해줄 폴더와 insertform.jsp파일을 만들어준다.

 

***스프링 인코딩 설정 방법***

https://titlejjk.tistory.com/215

 

요청파라미터를 추출하는 방법은 세가지가 있다

1. HttpServletRequest 객체를 Controller 메소드로 전달 받아서 직접 추출

/*
	 *	[요청 파라미터 추출하는 방법1] 
	 * 	HttpServletRequest 객체를 Controller 메소드로 전달 받아서 직접 추출한다.
	 */
	@RequestMapping("/member/insert")
	public String insert(HttpServletRequest request) throws UnsupportedEncodingException {
		request.setCharacterEncoding("utf-8");
		int num = Integer.parseInt(request.getParameter("num"));
		String name = request.getParameter("name");
		String addr = request.getParameter("addr");
		
		System.out.println(num + "|" + name + "|" + addr);
		
		return "member/insert";
	}

2.파라미터명과 동일하게 메소드의 매개변수를 선언해 놓으면 자동으로 추출해서 넣어준다.

 /*
	    *  [ 요청 파라미터 추출하는 방법 2 ]
	    *  
	    *  파라미터명과 동일하게 메소드의 매개변수를 선언해 놓으면 자동으로 추출해서 넣어준다.
	    *  
	    *  <input name="num">  이면  int num or String num
	    *  <input name="email"> 이면  String email  이런 식으로 선언 하면 된다. 
	    */
	@RequestMapping("/member/insert2")
	public String inser2(int num, String name, String addr) {
		
		return "member/insert";
	}

 

만약 int를 받아야 하는 자리에 문자열이 들어가게 되면 HTTP 상태 400번 오류가 발생한다.

 

3.파라미터명과 동일한 필드명을 가지고 있는 dto 클래스 type을 메소드의 매개변수로 선언해 놓으면 자동으로 추출해서 dto에 추출한 값을 setter메소드를 이용해서 넣은 다음 해당 dto객체에 참조값이 전달된다.

package com.gura.step01.member;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MemberController {
   // "/member/insertform" 요청을 처리할 메소드 만들기
   @RequestMapping("/member/insertform")
   public String insertform() {
      //응답할 jsp 페이지의 위치를 리턴해주면 된다.
      return "member/insertform";
   }
   /*
    *  [ 요청 파라미터 추출하는 방법 1 ]
    *  HttpServletRequest 객체를 Controller 메소드로 전달 받아서 직접 추출한다.
    */
   @RequestMapping("/member/insert")
   public String insert(HttpServletRequest request) throws UnsupportedEncodingException {
      //폼 전송되는 파라미터 추출하기 
      int num=Integer.parseInt(request.getParameter("num"));
      String name=request.getParameter("name");
      String addr=request.getParameter("addr");
      
      System.out.println(num+"|"+name+"|"+addr);
      
      return "member/insert";
   }
   /*
    *  [ 요청 파라미터 추출하는 방법 2 ]
    *  
    *  파라미터명과 동일하게 메소드의 매개변수를 선언해 놓으면 자동으로 추출해서 넣어준다.
    *  
    *  <input name="num">  이면  int num or String num
    *  <input name="email"> 이면  String email  이런 식으로 선언 하면 된다. 
    */
   @RequestMapping("/member/insert2")
   public String insert2(int num, String name, String addr) {
      
      System.out.println(num+"|"+name+"|"+addr);
      
      return "member/insert";
   }
   /*
    *  [ 요청 파라미터 추출하는 방법 3 ]
    *  
    *  파라미터명과 동일한 필드명을 가지고 있는 dto 클래스 type 을  메소드의 매개변수로 선언해 놓으면
    *  자동으로 추출해서 dto 에  추출한 값을 setter 메소드를 이용해서 넣은 다음  해당 dto 객체의 
    *  참조값이 전달된다.
    *  
    *  pulic class MemberDto{
    *     private int num;  => <input name="num">
    *     private String name; => <input name="name">
    *     private String addr; => <input name="addr">
    *  }
    *  
    */
   @RequestMapping("/member/insert3")
   public String insert3(MemberDto dto) {
      
      System.out.println(dto.getNum()+"|"+dto.getName()+"|"+dto.getAddr());
      
      return "member/insert";
   }
}

 

 

forward으로 이동이 아닌 리다이렉트 이동은 / 통해 최상위 경로로 가게 해준다. 리다이렉트 응답을 할때는

"redirect : 새로 요청할 경로" 형식으로 view page정보를 작성하면 된다.

 

JSON으로 응답받는 방법 3가지

@Controller
public class TestController {

		@ResponseBody
		@RequestMapping("/test/json1")
		public String json1() {
			
			return "{\"num\":1, \"name\":\"kim\",\"addr\":\"seoul\"}";
		}
		
		@ResponseBody
		@RequestMapping("/test/json2")
		public MemberDto json2() {
			MemberDto dto = new MemberDto();
			dto.setNum(2);
			dto.setName("해골");
			dto.setAddr("원숭이");
			
			return dto;
		}
		
		@RequestMapping("/test/json3")
		public Map<String, Object>json3(){
			Map<String, Object> map = new HashMap<>();
			map.put("num", 3);
			map.put("name", "원숭이");
			map.put("addr", "동물원");
			return map;
		}
}

 

List를 이용하여 배열로 전달받기

@ResponseBody
		@RequestMapping("/test/json4")
		public List<String> json4(){
			List<String> names = new ArrayList<String>();
			names.add("김구라");
			names.add("해골");
			names.add("원숭이");
			
			return names;
		}

Dto 생성자를 내려받아서 전달받기

@ResponseBody
		@RequestMapping("/test/json5")
		public List<MemberDto> json5(){
			List<MemberDto> list = new ArrayList<>();
			list.add(new MemberDto(1, "김구라", "노량진"));
			list.add(new MemberDto(2, "해골", "행신동"));
			list.add(new MemberDto(3, "원숭이", "동물원"));
			
			return list;
		}
더보기

Dto or Map                       =>   { }

List                                   =>    [ ]

List<String>                     =>     ["xxx","xxx",...]

List<Dto> or List<Map>   =>[ { },{ },...]

List<Map>으로 JSON내려받기

@ResponseBody
		@RequestMapping("/test/json6")
		public List<Map<String, Object>> json6(){
			List<Map<String, Object>> list = new ArrayList<>();
			
			Map<String, Object> map1 = new HashMap<>();
			map1.put("num", 1);
			map1.put("name", "김구라");
			map1.put("addr", 1);
			
			Map<String, Object> map2 = new HashMap<>();
			map2.put("num", 2);
			map2.put("name", "해골");
			map2.put("addr", "행신동");
			
			Map<String, Object> map3 = new HashMap<>();
			map3.put("num", 3);
			map3.put("name", "원숭이");
			map3.put("addr", "동물원");
			
			list.add(map1);
			list.add(map2);
			list.add(map3);
			
			return list;
		}

정리하자면 JSON문자열로 응답하는 방법은

  1. pom.xml에 jackson-databind dependency를 추가한다.
  2. 컨트롤러 메소드에 @ResponseBody 어노테이션을 붙여준다.
  3. Dto, List, Map등을 컨트롤러에서 리턴해주면 해당 객체에 담긴 정보가 json으로 구성되어서 응답된다.

'수업내용' 카테고리의 다른 글

20230620 수업내용😢😢😢  (0) 2023.06.20
20230619 수업내용🙌🙌🙌  (0) 2023.06.19
20230616 수업내용🫡🫡🫡  (0) 2023.06.16
20230615 수업내용👏👏👏  (0) 2023.06.15
20230614 수업내용🧏‍♂️  (0) 2023.06.14

댓글