암호화 되어있는 위도, 경도가 존재한다. 암호화 된 데이터는 "위도,경도" 형식으로 존재하고 있으며 프론트에서 JSON 으로 바디에 담아 보내주고 서버에서는 바디에 담긴 데이터를 받아 복호화 후 다시 프론트로 응답한다.
JSON 형태로 구성되어있으며, body를 통해 서버로 보내준다.
{
encList :[
"AAA,BBB",
"CCC,DDD",
"EEE,FFF",
"GGG,HHH",
"III,JJJ"
]
}
프론트에서 보낸 데이터를 받기 위한 DTO를 생성.
public class ReqDto{
List<String> encList;
public List<String> getEncList(){
return encList;
}
}
응답 결과를 리턴하기 위한 DTO 생성
public class ResDto{
List<String> decList;
public ResDto(List<String> decList){
this.decList = decList;
}
}
@RestController
@RequiredArgsConstructor
public class Controller{
private final Service service;
public ResponseEntity<> decrypt(@RequestBody ReqDto dto){
ResDto response = service.decryptData(dto);
return new ResponseEntity<>(response,HttpStatus.OK);
}
}
@Service
@RequiredArgsConstructor
public class Service{
private final LocalDecrypt localDecrypt;
public ResDto decryptData(ReqDto dto){
List<String> enList = dto.getEncList();
List<String> list = enList.stream().map(encStr -> encStr.split(","))
.map(encArr -> {
Arrays.stream(encArr).map(enc -> localDecrypt.decrypt(enc))
.collect(Collectors.joining(","));
}).collect(Collector.toList());
return new ResDto(list);
}
}
List에 담긴 String은 "위도,경도" 형태이기 때문에 한번에 복호화할 수가 없다.
enList.stream().map(encStr -> encStr.split(","))를 통하여 String 데이터를 하나씩 꺼내 split을 사용하여 String[] 배열로 만든다.
String : "AAA,BBB" -> String[] : {"AAA","BBB"}
배열 또한 stream이 가능하기 때문에 Arrays.stream()을 통해 로직을 수행한다.
Arrays.stream(encArr).map(enc -> localDecrypt.decrypt(enc)) 을 통하여 인코딩된 각 스트링을 복호화한다. String[] {"AAA","BBB"} -> String[] {"111","222"}
복호화된 각각의 String[] 값을 .collect(Collectors.joining(",")) 메소드를 통하여 하나의 문자열로 다시 합쳐준다. String[] {"111","222"} -> String : "111,222"
내부 스트림을 통한 리턴값은 String이고 외부 스트림에서 다시 .collect(Collector.toList()) 메소드를 통해 List<String>
으로 콜렉트 한다.
ResDto 생성자에 결과값을 넣어주고 컨트롤러를 통해 값과 상태코드를 리턴한다.
글을 쓴 이유 : 여태까지 stream을 사용했을 때 중간처리 메소드들이 간단하게 해결되었다. 하지만, 이번 로직을 작성하면서 중간처리 과정에서 복잡한 로직이 존재했고, 중간처리 과정에서 다시 한번더 스트림을 생성하여 스트림 처리를 할 수 있다는것을 배웠다.