(Java) Stream을 이용한 복호화

지식저장공간·2023년 3월 27일
0

Java

목록 보기
17/18
post-thumbnail

Stream을 이용한 위도, 경도 복호화

암호화 되어있는 위도, 경도가 존재한다. 암호화 된 데이터는 "위도,경도" 형식으로 존재하고 있으며 프론트에서 JSON 으로 바디에 담아 보내주고 서버에서는 바디에 담긴 데이터를 받아 복호화 후 다시 프론트로 응답한다.

Front

JSON 형태로 구성되어있으며, body를 통해 서버로 보내준다.


{
  encList :[
    		"AAA,BBB",
            "CCC,DDD",
            "EEE,FFF",
            "GGG,HHH",
            "III,JJJ"           
           ]
}

Back

ReqDto

프론트에서 보낸 데이터를 받기 위한 DTO를 생성.

public class ReqDto{

	List<String> encList;
    
    public List<String> getEncList(){
    	return encList;
    }
}

ResDto

응답 결과를 리턴하기 위한 DTO 생성

public class ResDto{

	List<String> decList;
    
    public ResDto(List<String> decList){
    	this.decList = decList;
    }

}

Controller

@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

@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);
    }

}

서비스 로직 정리

  1. List에 담긴 String은 "위도,경도" 형태이기 때문에 한번에 복호화할 수가 없다.

  2. enList.stream().map(encStr -> encStr.split(","))를 통하여 String 데이터를 하나씩 꺼내 split을 사용하여 String[] 배열로 만든다.
    String : "AAA,BBB" -> String[] : {"AAA","BBB"}

  3. 배열 또한 stream이 가능하기 때문에 Arrays.stream()을 통해 로직을 수행한다.

  4. Arrays.stream(encArr).map(enc -> localDecrypt.decrypt(enc)) 을 통하여 인코딩된 각 스트링을 복호화한다. String[] {"AAA","BBB"} -> String[] {"111","222"}

  5. 복호화된 각각의 String[] 값을 .collect(Collectors.joining(",")) 메소드를 통하여 하나의 문자열로 다시 합쳐준다. String[] {"111","222"} -> String : "111,222"

  6. 내부 스트림을 통한 리턴값은 String이고 외부 스트림에서 다시 .collect(Collector.toList()) 메소드를 통해 List<String>으로 콜렉트 한다.

  7. ResDto 생성자에 결과값을 넣어주고 컨트롤러를 통해 값과 상태코드를 리턴한다.

글을 쓴 이유 : 여태까지 stream을 사용했을 때 중간처리 메소드들이 간단하게 해결되었다. 하지만, 이번 로직을 작성하면서 중간처리 과정에서 복잡한 로직이 존재했고, 중간처리 과정에서 다시 한번더 스트림을 생성하여 스트림 처리를 할 수 있다는것을 배웠다.

profile
발전하는 개발자가 꿈입니다. 지식을 쌓고 지식을 활용해 목표 달성을 추구합니다.

0개의 댓글