Hospital hospital = hospitalDao.findById(id);
Optional<Hospital> opt = Optional.of(hospital);
if (opt.isEmpty()) {
return "찾는 아이디가 없습니다.";
}
log.info("ID:"+id+"가 조회되었습니다.");
String status = statusCode.get(hospital.getBusinessStatusCode());
return String.format("1. 병원 이름 : %s,\n2. 주소 : %s,\n3. 도로명 주소 : %s,\n4. 의료진 수 : %d,\n" +
"5. 병상 수 : %d,\n6. 면적 : %f,\n7. 폐업여부 : %s",
hospital.getHospitalName(), hospital.getFullAddress(), hospital.getRoadNameAddress(), hospital.getHealthcareProviderCount(),
hospital.getTotalNumberOfBeds(), hospital.getTotalAreaSize(), status);
⭕️ 해결
of 대신 ofNullable로 변경
Optional<Hospital> opt = Optional.ofNullable(hospital);
mvn package
[ERROR] Errors:
[ERROR] HospitalApiApplicationTests.contextLoads » IllegalState Failed to load Applica...
[ERROR] ReadLineContextTest.readFile » IllegalState Failed to load ApplicationContext
[ERROR] ReadLineContextTest.readFileAndSave » IllegalState Failed to load ApplicationC...
[INFO]
[ERROR] Tests run: 4, Failures: 0, Errors: 3, Skipped: 0
로컬에서는 테스트에 통과하는데 서버에서는 안되는 경우가 있음
⭕️ 해결
일단 test를 스킵하고 메이븐 빌드
mvn -DskipTests=true package
target에 jar 파일이 생겼는 지 확인
❌ 그냥 docker run ~
을 하면 도커에서 포트를 쓸 수 없다.
⭕️ 포트포워딩해서 띄우기
docker run -p 8080:8080 springboot-jdbc-template
🚫 에러 : denied 됨..
❌ 관리자 권한으로 접근해야 한다고 한다.
docker login
하지만, 이것도 방법이 아니었다.
docker run을 실행했을 때 local에 해당 image가 없으면 Hub에서 찾으려고 한다. 그래서 로그인을 하라고 하는 것인데, 보통 이미지 이름을 잘못 입력한 경우인 듯
그래서 이름을 확인하고 images에 있는 이름을 또박또박 입력해보자.
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-11-02 06:37:04.874 ERROR 1 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
⭕️ 데이터 베이스를 넘기기 위해 환경변수를 설정해야 한다.
docker run -p 8080:8080 springboot-jdbc-template -e SPRING_DATASOURCE_URL=jdbc:mysql://[EC2도메인주소]:3306/likelion
아…나는 application.yml을 안 올렸다.
1) 환경변수로 다 올린다…
2) 그냥 다시 올린다… <<<<< 선택
같은 에러가 계속 나고 비슷한 이미지가 2개가 되었다.
그래서 이미지를 삭제해보기로 했다.
⭕️ image 삭제하기
docker rmi [이미지이름]
사용되고 있어서 지워지지 않는다고 한다.
명령어로 내려간 container 까지 확인해서 다 지워준다.
root@ip-172-31-20-22:~/springboot-hospital-api# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57d8c9ff16cb spring-boot-template "java -Djava.securit…" 5 minutes ago Exited (1) 5 minutes ago epic_napier
72b714ab677f spring-boot-template "java -Djava.securit…" 2 hours ago Exited (1) 2 hours ago nifty_bohr
6767b51cd305 spring-boot-template "java -Djava.securit…" 2 hours ago Exited (1) 2 hours ago festive_chatelet
cffc90d13350 spring-boot-template "java -Djava.securit…" 2 hours ago Exited (1) 2 hours ago silly_faraday
1913f2bdc8f8 spring-boot-template "java -Djava.securit…" 2 hours ago Exited (1) 2 hours ago recursing_ganguly
63039731378c spring-boot-template "java -Djava.securit…" 2 hours ago Exited (1) 2 hours ago beautiful_chatelet
b3648383cf13 spring-boot-template "java -Djava.securit…" 2 hours ago Exited (1) 2 hours ago brave_bhaskara
root@ip-172-31-20-22:~/springboot-hospital-api# docker container rm 57d8c9ff16cb
57d8c9ff16cb
root@ip-172-31-20-22:~/springboot-hospital-api# docker container rm 72b714ab677f
72b714ab677f
...
#컨테이너 다 내리고 이미지를 지워본다
root@ip-172-31-20-22:~/springboot-hospital-api# docker rmi spring-boot-template
Untagged: spring-boot-template:latest
Deleted: sha256:fc10fbc722dc3adb5350318bf5cbc5642f7383bfaab3363c5b9962994c4952c2
Deleted: sha256:57f6168c97ec1315355648465696a7085d3c6cdc9c5b4d805b58e43d91f60ce6
Deleted: sha256:2621ca10a36ff1b756fcb3e1163a19c92e9ae93a1bea9b697987839473a63b89
root@ip-172-31-20-22:~/springboot-hospital-api# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot-jdbc-template latest ba41d2d1ac34 2 hours ago 456MB
openjdk 11-jdk-slim 8e687a82603f 3 months ago 424MB
스프링은 작동이 되고 LTE를 통해서 swagger로 api도 보였다. 하지만 api를 요청하니 서버 500 에러가 발생하고 아래와 같은 에러가 발생하였다.
2022-11-02 08:57:08.455 ERROR 1 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.] with root cause
java.net.ConnectException: Connection refused (Connection refused)
톰캣 구동 시 포트 번호가 일치하지 않아서 발생한 오류라고 한다. 연결하려는 호스트 이름 및 포트를 확인한다.
⭕️ image 이름을 맨 마지막에 넣으니까 되었다!
환경변수로 적은 것이 먹히지도 않았던 것이었다. 앞에 스프링이 뜨지도 않았던 것도 이와 같은 이유일 것 같다.
docker run -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://[ec2도메인주소]:3306/likelion -e SPRING_PROFILES_ACTIVE=aws springboot-jdbc-template