개요
현직에서 업무를 하다 보면 기업 간의 API 통신이 이루어질 때가 왕왕 있습니다. 예를 들어, 생체 인증을 해서 로그인을 한다던가 또는 메일 발송을 해당 기업의 API를 사용할 때입니다. 그럴 때마다 서로 API 문서를 주고받고 필요한 값들을 넘겨주게 됩니다.
예를 들어, 메일 발송이라 가정했을 때 발신자, 제목, 본문, 파일, 수신자 등 다양한 정보를 넘겨주게 됩니다. 하지만 외부 API를 직접 테스트 할 수는 없기에 내가 보내는 값만 정상적으로 보내는지 체크할 수 있을 뿐, 응답값이 제대로 나오는지 확인이 불가능합니다.
이럴 때 유용하게 사용하는 기능이 HTTP Server입니다. 하단에서 좀 더 자세히 살펴볼까요?
HTTP Server란?📙
HTTPServer는 Java에서 간단한 웹 서버를 구현할 수 있게 해주는 class입니다. Java SE 6부터 포함된 com.sun.net.httpserver 패키지에서 제공되며, 주로 테스트 목적이나 간단한 HTTP 서버를 구축할 때 사용됩니다.
HTTP Server Class 사용
HTTP Server 클래스는 HTTP 요청을 처리하는 서버를 생성할 수 있게 해줍니다.
해당 클래스는 정적 메서드 create()를 통해 인스턴스를 생성하며, 포트 번호와 백로그 크기를 지정할 수 있습니다. 예시 코드를 살펴볼까요?
public class HttpServerManager {
private final int DEFAULT_BACKLOG = 0;
private HttpServer server = null;
/**
* 생성자
*/
public HttpServerManager(String host, int port) throws IOException {
createServer(host, port);
}
/**
* 서버 생성
*/
private void createServer(String host, int port) throws IOException {
this.server = HttpServer.create(new InetSocketAddress(host, port), DEFAULT_BACKLOG);
// 이메일 테스트
server.createContext("/test/email", new EmailHandler());
}
/**
* 서버 실행
*/
public void start() {
server.start();
}
/**
* 서버 중지
*/
public void stop(int delay) {
server.stop(delay);
}
}
HttpServerManager는 제가 임의로 만든 class입니다. 해당 클래스의 생성했을 때 매개변수로 넘겨받은 host와 port를 이용하여 Http server를 생성하게 구현하였습니다. createContext 메서드는 특정 URL 경로에 대한 요청을 처리할 핸들러를 등록할 수 있습니다. 저는 emailHandler라는 핸들러를 하위에서 만들 예정입니다.
또한, start() 메서드와 stop() 메서드를 통해 서버를 실행하고 중지하는 기능도 추가하였습니다.
public class EmailHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) {
// 이메일 API
if(exchange.getRequestURI().toString().startsWith("/test/email")) {
sendMail(exchange)
}
}
... sendMail 함수 생략
}
EmailHandler는 Java에서 제공되는 HttpHandler를 상속받아 구현하였습니다. handle() 메서드는 클라이언트가 "/test/email"와 같은 등록된 컨텍스트로 요청을 보낼 때, 해당 경로에 매핑된 EmailHandler의 handle 메서드가 호출되어 요청을 처리합니다.
저는 이메일 발송 테스트를 진행하기 때문에 exchange.getRequestURI() 메서드를 이용하여 요청 경로를 가져오고 이전에 지정한 "/test/email"일 경우에는 sendMail()을 실행하도록 코드를 구현하였습니다.
sendMail() 함수는 API 명세서에 맞게 데이터(발신자, 수신자, 제목, 본문 등)를 받아서 메일을 발송하게 됩니다. 혹시나 SMTP 사용법을 모르시면 링크를 클릭하셔서 자세한 내용을 확인해 주세요!
마지막으로 지금까지 만든 서버를 실행시키는 코드입니다.
public class HttpServerManagerMain {
public static void main(String[] args) {
String host = "127.0.0.1";
String port = "8080";
HttpServerManager httpServerManager = new HttpServerManager(host, port);
httpServerManager.start();
}
}
정리하자면,
1. httpServerManager를 생성하면 생성자에 등록한 createServer() 메서드가 실행
2. createServer()에서는 서버를 생성한 후 특정 경로인("/test/email") 컨텍스트를 생성
3. 이후에 클라이언트에서 해당 경로로 요청을 들어올 때 EmailHandler에서 요청을 감지하고 handle() 메서드 실행
4. 각각의 요청을 분기처리
5. 이메일일 경우 sendMail() 메서드를 실행
추가적으로 Client 코드를 살펴볼게요
... 생략
try {
JSONObject obj = new JSONObject();
obj.put("sender", "binco");
obj.put("title", "Email Test");
obj.put("content", "Email Content");
obj.put("to", "binco2");
String sendData = obj.toString();
HttpClient client = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost("http://127.0.0.1:8000/test/email");
httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Connection", "keep-alive");
httpPost.setEntity(new StringEntity(sendData, "UTF-8") );
HttpResponse response = client.execute(httpPost);
} catch(Exception E) {
// 에러 처리
}
1. JSONObject에 이메일의 관한 내용 추가
2. Apache HttpClient 라이브러리에서 제공하는 HttpClient 클래스를 이용하여 url, header, body 설정
3. HttpClient의 execute() 메서드를 이용하여 HttpPost 요청 실행
4. HttpResponse 객체로 상태 코드 및 응답 본문 정보 리턴
마치며
지금까지 HTTP Server를 Java에서 활용하는 방법에 대한 포스팅이었습니다. 생각 보다 기업 간의 API 통신이 많아서 테스트 용으로 많이 사용하니깐 꼭 숙지하셨으면 좋겠네요.
다음 포스팅은 아직 예정이 없지만 더 좋은 내용으로 빠르게 찾아뵐게요😄
👨👩👦👦 오픈채팅방 운영
취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁
참여코드 :
'TIL' 카테고리의 다른 글
Java IP 유효성 검사 및 여러 유용한 함수 모음 (1) | 2024.09.24 |
---|---|
Java Spring Scheduler 정의 및 사용법 예시 (1) | 2024.09.13 |
SMTP 정의 및 Java에서 메일 발송 기능 활용해보기(간단 예시) (2) | 2024.09.04 |
리눅스 파티션 추가 및 디스크 포맷 & 마운트 설정하는 방법(예시포함) (0) | 2024.04.30 |
HTTP와 HTTPS의 차이점 (0) | 2024.04.25 |