요르딩딩

DTO를 사용해보자 본문

[Web]/[Spring]

DTO를 사용해보자

요르딩딩 2022. 8. 12. 14:16
728x90
반응형

기존에는

HttpServletRequest의 객체를 RequestUtil을 사용하여, getParameter()값을 모두 map으로 전환하여, 사용하였다.

이렇게 사용하게되면, request Parameter로 어떤 값을 받던지, 모두 컨트롤러로 들어오기때문에, 개발자 입장에서는 DTO를 생성할 필요없이 편리하게 개발할 수 있었다. 

( RequestUtil.paramToHashMap(request); )

다만, 원리상 DTO를 사용하게 되면, 보안적인 측면에서도 좋고, 요청 파라미터에 매핑 오류시, 컨트롤러에 들어오기전에 걸러낼 수 있기때문에 더 효율적이라고 한다. 그렇기에 이번시간에는 DTO를 적용한 테스트를 진행해보았습니다.

 

1. Dto 생성에 있어서 @Getter, @Setter는 자동생성해 주는 어노테이션이다. 이것을 적용하기 위해서는 pom.xml에 lombok를 적용시켜줘야 한다.

 

[pom.xml]

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
    <scope>provided</scope>
</dependency>

 

2. Dto를 생성해보자. 이제 lombok를 추가했으므로, @Getter, @Setter 적용가능.

- @JsonProperty 어노테이션은 객체를 JSON 형식으로 변환할 때 Key의 이름을 설정하여, 매핑시킬 수 있습니다.

- @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) : 스네이크 형식을 카멜형식에 맞도록 전체 매핑 시킬 수 있습니다.

 

[Dto생성]

package com.dto;


import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class TestDto {
	
	private long no;
	private String firstName;
	private String secondName;
	
//	@JsonProperty("pluse_map")
	private String pluseMap; // JSON Object를 stringify한 값
}

 

3. @RequestBody를 활용하여 Dto 사용하기.

 

[Dto 적용 Controller]

package com.controller;

import java.io.IOException;
import java.util.HashMap;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dto.TestDto;
import com.util.JsonUtil;

import lombok.RequiredArgsConstructor;

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequiredArgsConstructor
@RequestMapping("/dto")
public class DtoController {

	@SuppressWarnings("unchecked")
	@PostMapping("/test")
	public ResponseEntity<?> test(@RequestBody TestDto testDto) throws IOException {
		
		long no           = testDto.getNo();
		String firstName  = testDto.getFirstName();
		String secondName = testDto.getSecondName();
		String pluseMapSt = testDto.getPluseMap();
		
		HashMap<String, Object> pluseMap = JsonUtil.toHashMapObject(pluseMapSt); // JSON Object의 String을 Map으로 변환한 값
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("no"         , no);
		map.put("first_name" , firstName);
		map.put("second_name", secondName);
		map.put("pluse_map"  , pluseMap);

		return ResponseEntity.ok(map);
	}
}

 

[결과]

728x90
반응형

'[Web] > [Spring]' 카테고리의 다른 글

[Spring] branch 생성 및 적용하는법  (0) 2022.09.20
JUnit 테스트하는 방법  (0) 2022.09.14
Spring SQL log 남기기  (0) 2022.07.07
@RequestBody로 body데이터 꺼내기  (0) 2022.04.21
[뉴렉처] Spring MVC 강의 (1,2,3,4,5)  (0) 2022.03.14
Comments