POST 요청 보내기

김태연·2024년 11월 5일

TmT 프로젝트

목록 보기
3/9

Postman을 활용한 테스트를 마쳤으니, 이제 본격적으로 코드를 짜보자.
Spring Boot를 통해 요청을 보내보자!

1. Controller

@RestController
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/api/bank")
public class BankController {

	private final BankServiceImpl bankService;
	
	@PostMapping("/InquireDepositorAccountNumber")
	public ResponseEntity<FundResponse> 예금주조회(@RequestBody FundRequest request) {
		System.out.println("예금주 조회 실행");
		System.out.println("request in Controller : " + request);
		FundResponse response = bankService.예금주조회(request);	
		return ResponseEntity.ok(response);
	}
	
}

변수명을 고민하기 싫어서 일단 한국어로 처리했다. 나중에 영어로 바꿔보자ㅎㅎ
BankController 를 하나 만들고, 생성자 주입으로 DI 해결.
하나 만들기가 어렵지 두번부턴 쉽다. 예금주조회 기능을 먼저 완성해보자!

컨트롤러에서 /api/bank/InquireDepositorAccountNumber 명령을 받으면, 서비스단의 예금주조회로 요청을 가도록 만들어놨다.

그 다음엔, 서비스로 가서 입력받은 값을 이용해 POST 요청을 만들어야 한다.

2. Service

@Service
@Log4j2
@RequiredArgsConstructor
public class BankServiceImpl implements FundManagement {

//	private final FundManagementRepository fundManageMentRepository;
	private final Util util;
	
	@Override
	public FundResponse 예금주조회(FundRequest request) {
		log.info("예금주 조회");
		// 바디에 값 담아주기
		NHBody body = util.createPostWithAcnoBncd("InquireDepositorAccountNumber", request.getAcno(), request.getBncd());
		// 요청 보내기
		FundResponse response = util.sendPostRequest(body, "https://developers.nonghyup.com/InquireDepositorAccountNumber.nh");
		return response;
	}
}

서비스함수에서는 아까 요청받은 FundRequest 에서 acno 값과 bncd 값을 꺼내서 body에 담아준다. Http 요청을 만들어주는 역할은 Util 클래스를 따로 생성해서 만들어줬다.

@Component
public class Util implements FundManagement {

	static int tuno = 0;
	
	public FundResponse sendPostRequest(NHBody body, String url) {
		RestTemplate restTemplate = new RestTemplate();
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);
		headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
		
		// 요청 바디와 헤더를 HttpEntity에 담기
		HttpEntity<NHBody> request = new HttpEntity<>(body, headers);
		FundResponse response = restTemplate.exchange(url, HttpMethod.POST, request, FundResponse.class).getBody();
	
		// 응답 출력
		System.out.println("Response body: " + response);
		return response;
	}
	
	public NHBody createPostWithAcnoBncd(String apiName, String Acno, String Bncd) {
		// 헤더 설정
		RequestHeader header = new RequestHeader(tuno++);
		header.setApiNm(apiName);
		setDefaultValue(header);
		NHBody body = new NHBody();
		body.setHeader(header);
		body.setAcno(Acno);
		body.setBncd(Bncd);
		return body;
	}
	
	public void setDefaultValue(RequestHeader header) {
		header.setTsymd("20241105");	// 오늘
		header.setTrtm("235959");	// 지금
		header.setIscd("002689");
		header.setFintechApsno("001");
		header.setApiSvcCd("DrawingTransferA");
		header.setAccessToken("b9d4287c56837389287280605835848794a6e0d722a16c64726c5c8fd78ff23d");
	}
}

이런식으로 util에서 http 요청을 만들어준다. 책임을 명확하게 나타내기 위해 클래스를 분리해줬다.

작동은 성공했으나, NH에서 제공하는 open API의 기능에 내가 원하는 기능이 충분히 있지 않아서 금융결제원 오픈API를 사용하기로 바꿨다 ㅠㅠ 오늘 하루를 날려버려서 아쉽다.
이 글을 보는 사람은 처음부터 금융결제원 오픈API를 사용하는 것을 추천한다!

profile
취업준비중입니다..!

0개의 댓글