LostCatBox

SpringProject-TrackingPost-CH04

Word count: 726Reading time: 4 min
2022/12/24 Share

Project 통합택배조회 api 04편 (세번째 구현-마지막)

Created Time: September 14, 2022 11:47 PM
Last Edited Time: September 16, 2022 5:22 PM
Tags: Java, Spring, Computer

왜?

이전편에서 service별로 나눠서 msa구조를 따라하였고, 이에 따라 scale-out 도 가능한 구조로 만들었다.

kafka를 적용하였고, docker-compose를 통해 구조 및 내부네트워크를 활용하였다.

이젠, 마지막 카카오톡 채널과 연결

해야할것

  • AWS 적용
  • kakao channel에 맞는 답변으로 백엔드 응답 변경

생각해볼것

  • https ssl인증? → 카카오채널 https필수아님. 사용X
  • aws → aws ec2사용
  • docker처리? → docker-compose 사용
  • 고유링크로 만든 페이지쪽으로 이동(트레픽생각하기) → 페이지 구현
  • kakao_id로 유저인증? jwt token사용? 카카오브라우저는? 쿠키 사용가능? → kakao_id사용
  • null 처리 또는 객체 valid처리?

AWS적용

인스턴스 생성

ec2 인스턴스 생성 및 보안 설정으로 사용할 포트 열어주기

https://zzang9ha.tistory.com/360

https://zzang9ha.tistory.com/338?category=999709

도메인 연결

  • AWS EC2 탄력적 IP 기능 활성화
  • cloud flare에서 DNS로 IP와 도메인 연결(tracking.lostcatbox.com)

docker-compose

  • docker 설치
1
2
3
curl -fsSL https://get.docker.com/ | sudo sh
sudo systemctl status docker // 실행 중인지 확인
docker --version // 버전 확인
  • docker-compose설치
1
2
3
sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose // 컴포즈 설치
sudo chmod +x /usr/local/bin/docker-compose // 권한설정
docker-compose --version // 버전확인
  • java 11 설치
    (./gradlew bootJar위해서)
1
2
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install openjdk-11-jdk

nginx

카카오 봇에서도 IP+포트로 요청이 불가능하다면, subdomain별로 요청을 포트포워딩해줄 nginx를 구성해야한다.

하지만, 다행히 카카오 봇에서는 url:port로 요청이 가능했다. 구성한 aws,docker에서 포트 노출시키고 해당 IP+port로 요청 들어오는것 확인함

KakaoChannel 연결하기

  • kakao에서 8080포트와, 8082포트를 get과 post방식을 지원확인하기 → 지원함.
  • 요청은 post로 들어옴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
"intent": {
"id": "u3e3tgmsw7fpep61subrcnll",
"name": "블록 이름"
},
"userRequest": {
"timezone": "Asia/Seoul",
"params": {
"ignoreMe": "true"
},
"block": {
"id": "u3e3tgmsw7fpep61subrcnll",
"name": "블록 이름"
},
"utterance": "발화 내용",
"lang": null,
"user": {
"id": "796285",
"type": "accountId",
"properties": {}
}
},
"bot": {
"id": "5e3111fdffa7480001c2deaf",
"name": "봇 이름"
},
"action": {
"name": "fcict964u5",
"clientExtra": null,
"params": {
"post_company": "롯데택배",
"post_number": "236327061331"
},
"id": "0phticob61z4ntc4hc7f6mpw",
"detailParams": {
"post_company": {
"origin": "롯데택배",
"value": "롯데택배",
"groupName": ""
},
"post_number": {
"origin": "236327061331",
"value": "236327061331",
"groupName": ""
}
}
}
}
  • 응답 양식
1
2
3
4
5
6
7
{
"version": "2.0",
"data": {
"post_company": post_company,
"post_number": post_number,
"post_detail": data,
}

json 응답 데이터 직접작성

  • gradle 추가
1
implementation 'com.google.code.gson:gson:2.9.0'
  • gson사용
1
2
3
4
5
6
7
8
9
10
11
12
13
public String test3(){
JsonObject obj =new JsonObject();

obj.addProperty("title", "테스트3");
obj.addProperty("content", "테스트3 내용");

JsonObject data = new JsonObject();

data.addProperty("time", "12:00");

obj.add("data", data);

return obj.toString();

1

PostCompanyEnum 수정

실제 kakao에서 요청오는 것들은 지금 String으로 들어오므로 Enum으로 변환해주기 위해 다음과같이 Enum 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public enum PostCompanyEnum {
CJ("CJ대한통운"),
CU("CU편의점택배"),
EPOST("우체국택배"),
HANJIN("한진택배"),
LOTTE("롯데택배"),
EMS("EMS"),
ILOGEN("로젠택배"),
CVSNET("CVSNet"),
DHL("DHL");
private final String name;
PostCompanyEnum(String name){
this.name = name;
}
public String getName(){
return name;
}
public static PostCompanyEnum valueOfName(String name) {
return Arrays.stream(values())
.filter(value -> value.name.equals(name))
.findAny()
.orElse(null);
}
}

발생한 오류들

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

상황

서버를 밀고 다시 작업하여, pem키 입력후 ssh로 접속할려는데 에러 발생

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

원인

중간자 공격에 위험이 있다고 뜨는데, 이러한 경고의 이유는 전자서명 중 하나인 ECDSA가 관련해서 일치하지 않는다이고, 이를 해소하기 위해서는 아래의 명령어를 입력한다.

해결

ssh-keygen -R [~.~.~.~ ] //내가 접속할 ip주소

UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)

https://github.com/docker/compose/issues/3927

현상

docker-compose ec2에서 프리티어로 up —build처리시 다음과같은 에러 발생

UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)

원인

일시적오류이거나 컴퓨터 성능이 안좋음

해결

단순히 timeout만 늘려주면 되거나, scale-up해줘야함

나는 t2.micro → c3.medium 업글해서 해결

1
2
export DOCKER_CLIENT_TIMEOUT=120
export COMPOSE_HTTP_TIMEOUT=120

Task ‘prepareKotlinBuildScriptModel’ not found in project ‘:app’

Task ‘prepareKotlinBuildScriptModel’ not found in project ‘:app’

상황

gradle.build 변경사항 반영하다가 다음과 같은 오류 발생

해결

인텔리제이에서 플러그인 코틀린 비활성화

docker 용량 부족

1
2
3
4
docker volume prune //volume되어있는것 제거
docker network prune // networt제거
docker container prune
docker image prune

ReadTree()알아보기

아마 아예 json raw데이터를 받아야지. 할수있는듯..ㅡㅡ

뭘 받는지 뭘 반환하는지 다시 확인하기

Json 요청, 응답 처리 방법 정리하기

CATALOG
  1. 1. Project 통합택배조회 api 04편 (세번째 구현-마지막)
  2. 2. 왜?
    1. 2.1. 해야할것
    2. 2.2. 생각해볼것
  3. 3. AWS적용
    1. 3.1. 인스턴스 생성
    2. 3.2. 도메인 연결
    3. 3.3. docker-compose
    4. 3.4. nginx
  4. 4. KakaoChannel 연결하기
    1. 4.1. json 응답 데이터 직접작성
  5. 5. PostCompanyEnum 수정
  6. 6. 발생한 오류들
    1. 6.1. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
      1. 6.1.1. 상황
      2. 6.1.2. 원인
      3. 6.1.3. 해결
    2. 6.2. UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
      1. 6.2.1. 현상
      2. 6.2.2. 원인
      3. 6.2.3. 해결
    3. 6.3. Task ‘prepareKotlinBuildScriptModel’ not found in project ‘:app’
      1. 6.3.1. 상황
      2. 6.3.2. 해결
    4. 6.4. docker 용량 부족
  7. 7. ReadTree()알아보기
  8. 8. Json 요청, 응답 처리 방법 정리하기