Spring 실습

Spring 실습 8일차(응답(Response))(2)

choco2706 2024. 5. 1. 10:29

어제에 이어서 계속 해보자

5. 컬렉션 Map 타입

// 5. 컬렉션 Map 타입
	// JSON : JavaScript Object Notation(문자열)
	// Map 형태의 컬렉션 자료를 JSON 객체 타입의 데이터로 만들어서 반환
	@ResponseBody
	@GetMapping("/goHome05")
	public Map<String, Member> home05(){
		log.info("home05");
		
		Member member = new Member();
		Member member2 = new Member();
		
		member.setUserId("A001");
		member2.setUserId("B001");
		
		Map<String, Member> map = new HashMap<String, Member>();
		
		map.put("key1",member);
		map.put("key2",member2);
		
		// View : /views/goHome05.jsp(x)
		return map;
	}

 

@ResponseBody 어노테이션이 없으면 @GetMapping의 경로에 있는 jsp를 찾게 된다. 

@ResponseBody를 추가해야 페이지로 넘어가지 않고 데이터로써 전송된다.

 

6. ResponseEntity<Void> 타입

/* 6. ResponseEntity<Void> 타입
    response 할 때 Http 헤더 정보와 내용을 가공
    */
@ResponseBody
@GetMapping("/goHome06")
public ResponseEntity<Void> home06(){
log.info("home06");

// 응답 데이터가 없음(void)
// Http 상태 코드 : 200(성공)
return new ResponseEntity<Void>(HttpStatus.OK);
}

 

/goHome06 요청이 왔을 때 header정보에 HttpStatus.OK(200)을 반환한다.

 

f12룰 눌러 네트워크 탭에서 확인할 수 있다.

 

7. ResponseEntity<String> 타입

/* 7. ResponseEntity<String> 타입
    response 할 때 Http 헤더 정보와 문자열 데이터를 전달 
    
    Object : 객체(인스턴스) / Entity : 개체
    */
	@ResponseBody
	@GetMapping("/goHome07")
	public ResponseEntity<String> home07(){
		log.info("home07");
		
		return new ResponseEntity<String>("success",HttpStatus.OK);
	}

 

/goHome07 요청이 들어오면 SUCCESS라는 문자와 헤더에 HttpStatus가 200이 표시된다.

요청 결과

 

8. ResponseEntity<자바빈즈 클래스(VO)> 타입

/*
		8. ResponseEntity<자바빈즈 클래스:VO> 타입
		자바빈 규약 : 1. 프로퍼티, 2. 기본생성자, 3. getter/setter 메소드
		response 할 떄 http 헤더 정보와 객체 데이터를 전달
	 */
	@ResponseBody
	@GetMapping("/goHome08")
	public ResponseEntity<Member> home08(){
		log.info("home08");
		
		Member member = new Member();
		member.setUserId("A001");
		
		if(member.getUserId() == null) {
			return new ResponseEntity<Member>(member,HttpStatus.FORBIDDEN);
		} else {
			return new ResponseEntity<Member>(member,HttpStatus.OK);
		}
	}

 

/goHome08이 요청됐을 때 member 데이터가 null값이면 헤더에 FOBIDDEN(403)를 표시하고,

member 데이터가 null값이 아닐 때 OK(200)을 표시한다.

요청 결과

 

9. ResponseEntity<List> 타입

//9. ResponseEntity<List> 타입
//response할 때 Http 헤더 정보와
// 객체 배열 데이터를 전달
@ResponseBody
@GetMapping("/goHome09")
public ResponseEntity<List<Member>> home09(){

  List<Member> list = new ArrayList<Member>();

  Member member = new Member();
  list.add(member);
  Member member2 = new Member();
  list.add(member2);

  return new ResponseEntity<List<Member>>(list,HttpStatus.OK);
}

 

Member타입의 List를 반환하고 헤더에 OK(200)을 표시한다.

요청 결과

 

10. Response Map 타입

/* 10. Response Map 타입
	    JSON : JavaScript Object Notation(문자열) 
	    Map 형태의 컬렉션 자료를 JSON 객체 타입의 데이터로 
	    만들어서 반환
	    */
	   @ResponseBody
	   @GetMapping("/goHome10")
	   public ResponseEntity<Map<String, Member>> home10(){
	      log.info("home10");
	      
	      Map<String, Member> map
	       = new HashMap<String, Member>();
	      
	      Member member = new Member();
	      member.setUserId("a001");
	      
	      Member member2 = new Member();
	      member2.setUserId("b001");
	      
	      map.put("key1", member);
	      map.put("key2", member2);
	      
	      // View : /views/goHome10.jsp (x)
	      return new ResponseEntity<Map<String, Member>>(map, HttpStatus.OK);
	   }

요청 결과

 

11. ResponseEntity<byte[]> 타입

파일 업로드를 위한 타입

우선 이걸 사용하기 위해선 pom.xml에 common-fileupload 라이브러리가 필요함

더보기
<!-- 파일업로드 시작  -->
      <!-- common-fileupload 라이브러리는 tomcat7.0버전 이후로는
         서블릿3.0이상에서 지원함
       -->
      <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
      </dependency>
      
      <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
      <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.4</version>
      </dependency>
      
      <!-- 파일을 처리하기 위한 의존 라이브러리 -->
      <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
      <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.11.0</version>
      </dependency>
      
      <!-- 썸네일 -->
      <!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib -->
      <dependency>
          <groupId>org.imgscalr</groupId>
          <artifactId>imgscalr-lib</artifactId>
          <version>4.2</version>
      </dependency>
      
      <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
      <dependency>
          <groupId>net.coobird</groupId>
          <artifactId>thumbnailator</artifactId>
          <version>0.4.8</version>
      </dependency>
            
      <!-- 파일업로드 끝  -->

pom.xml 안에 dependencies 태그 안쪽에 적어준다.

 

※ pom.xml이 수정되면 maven build 실행하기 - BUILD SUCCESS가 떠야함

 /*
        11. ResponseEntity<byte[]> 타입
        response 할 때 Http 헤더 정보와 바이너리 (binary)
        binary : 2개 (0,1) => 사진, 영상, 음성
       	파일 데이터를 전달하는 용도로 사용
	    */
	   public ResponseEntity<byte[]> home1101() throws IOException{
		   log.info("home1101");
		   
		   // 00111011110011..
		   InputStream in = null;
		   
		   // 응답 객체
		   ResponseEntity<byte[]> entity = null;
		   
		   HttpHeaders headers = new HttpHeaders();
		   try {
			   // 스프링 생성 시 만들어진 기본 이미지 파일
			   // 이미지 리더로 읽는다.
			   in = new FileInputStream("C:\\eGovFrameDev-3.10.0-64bit\\workspace\\springProj\\src\\main\\webapp\\resources\\img\\avatar4.png");
			   headers.setContentType(MediaType.IMAGE_PNG);
			   
			   // 이미지를 읽은 결과 객체를 응답 개체에 할당
			   entity= new ResponseEntity<byte[]>(IOUtils.toByteArray(in),headers,HttpStatus.CREATED);
			   
		   } catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			in.close();
		}
		return entity;   
	   }

 

※ import 주의! 이름이 겹치는게 많아서 잘 보고 해야한다.

더보기
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.springframework.http.MediaType;

 

※ 혹시나 IOUtils 임포트가 위와 같이 되지 않는다면 아까 pom.xml을 제대로 수정했는지(저장, maven build) 확인해보자  

 

요청 결과

 

또 다른 예시

@ResponseBody
	   @GetMapping("/goHome1102")
	   public ResponseEntity<byte[]> home1102() throws IOException{
		   log.info("home1102");
		   
		   //Stream : 파일을 읽거나 쓸 때, 네트워크 소켓을 거쳐 통신할 때 쓰이는 추상적인 개념
	       //         데이터가 전송되는 통로
	       //InputStream : 추상 클래스. 데이터가 들어오는 통로의 역할에 관해 규정하고 있음
	       //            1) 데이터를 읽어야 함 2) 남은 데이터 확인 3) 데이터 skip 가능 4) close가능(통로 제거)
	       //            5) 특정 시점부터 다시 읽을 수 있음
		   
		   // 초기화
		   InputStream in = null;
		   ResponseEntity<byte[]> entity = null;
		   
		   HttpHeaders headers = new HttpHeaders();
		   
		   try {
			   in = new FileInputStream("C:\\eGovFrameDev-3.10.0-64bit\\workspace\\springProj\\src\\main\\webapp\\resources\\img\\avatar5.png");
			   
			   headers.setContentType(MediaType.IMAGE_PNG);
			   
			   // IOUtils : commons-io
			   // HttpStatus.CREATED : HTTP 상태 201 
			   entity = new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED);
			   
		   } catch (FileNotFoundException e) {
			   e.printStackTrace();
			   
			   entity = new ResponseEntity<byte[]>(HttpStatus.BAD_REQUEST);
		   } finally {
			   in.close();
		   }
		   return entity;
	   }

 

 

요청 결과