[항해 취업 리부트 코스] 프로젝트 1주차를 보내주며..

2024. 4. 23. 08:53카테고리 없음

이번 프로젝트는 시작이 젤 어려웠던것 같다. 

첫 과제가 docker환경 세팅이다보니 docker를 처음해보는 (심지어윈도우인) 나는 rinux 가상 머신이나 서버를 띄우는 시스템이 낯설게 다가왔다.

 

도커를 진행하면서 가장 힘들었던건 spring서버가 로컬에선 잘 동작하는데 도커컴포즈 서버에서 띄우면 db를 인식을 못하는 것이었다. 어쨌든 지금이야 로컬에서 서버를 돌리면 그만일수 있지만 MSA방식으로 개발하기 위해선 결국은 docker-compose위에 spring을 여러대 띄워서 돌리는 수 밖에 없기에 나는 해결을 해야만했다.

services:
  mysql:
    image: mysql:latest
    ports:
      - 3306:3306
    environment:
      - MYSQL_DATABASE=market
      - MYSQL_ROOT_PASSWORD=*****
  redis:
    image: redis:latest
    ports:
      - 26379:6379
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    depends_on:
      - redis
      - mysql
  spring:
    container_name: spring1
    image: my-spring-app
    expose:
      - 8080
    ports:
      - "8080:8080"
    depends_on:
      - redis
      - mysql

 

내 초기상태의 docker 컴포즈는 다음과 같았다. mysql과 redis nginx모두 공식 최신 이미지를 받아서 도커 컴포즈 위에 띄워주고 있어서 이미지 오류는 아마 아닐것 같았다.

그렇다면 아마 application.yml 파일에서 오류가 났을 확률이 높았다. gradle의존성이 부족했다면 애초에 빌드가 안됬을것 같기 때문에.

spring:
  data:
    redis:
      host: 127.0.0.1
      port: 26379
  datasource:
    url: jdbc:mysql://localhost:3306/market
    username: root
    password: siwon7096!
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
    open-in-view: false
jwt:
  secret:
    key:

 

이게 내 application.yml 파일의 상태였다. 생각해보니 도커컴포즈 위의 spring도 꺼지긴해도 빌드되던 중 오류가 발생한 로그를 확인할 수 있었다.

오류는 다음과 같았다.  'communications link failure'

즉 db와 연결을 실패한 것이었다. 이때부터 db연결이 문제인것을 알고 이것저것 시험해 보기 시작했다.

 

  • 도커컴포즈의 외부 포트번호를 23306에서 3307/3307 로 변경(실패)
  • 도커컴포즈의 포트 번호를 3306/3306으로 변경(실패)
  • 다양한 url시험(localhost+외부 포트 +내부포트 등등)(실패)

그러던 도중 검색을 통해 url에 docker-compose위에 띄운 db이름을 넣어줘야 한다는 말을 보았다. 바로 테스트를 해봤는데

jdbc:mysql://mysql:3306

 

이런식으로 작성하자 컨테이너가 실행중이지만 빌드자체가 되지 않았다. 로컬에서조차 돌아가지 않는것이었다.

./gradlew build(빌드를 사용했다)

빌드를 한 이유는 jar파일을 최신으로 갱신 시켜서 spring이미지를 만들기 위함 이었는데, 잘보니 빌드가 오류가나도 jar파일은 최신으로 갱신이 됬다.

이 jar파일을 가지고

docker build -t spring-app .

 

을 통해 spring이미지를 띄웠다. 그러자 놀랍게도 로컬에서 동작하지 않았던 db연결이 성공적으로 동작했다.

어째서 일까? 이유는 docker-compose 내부통신은 다르게 작동한다고 한다. 그렇기에 외부에서 db연결을위해 쓰던url은 동작하지 않고 외부에선 내부에서 사용한 url(컨테이너 이름을 넣은) 방식이 작동하지 않은것이다.

 

이것저것 생각할게 많은 도커인것같다 정말. 아직 spring을 한대밖에 못띄웠는데 MSA개발을 위해 여러 도메인을 띄우고 나면 아마 머리카락이 빠지지 않을까?

 

 

항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.

https://hanghae99.spartacodingclub.kr/reboot