오늘은 여태 배웠던 모든 지식을 활용하여
SpringBoot, MySQL, Redis를 묶어 하나의 서비스로 정의하고 실행시켜보겠습니다.
우선 Redis사용을 위해 build.gradle파일에 의존성 추가를 해주도록 하겠습니다.
dependencies부분에 아래와 같은 코드를 삽입해주세요.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
저장 후 꼭 우측 동그라미(Sync Gradle Change)를 클릭해야 의존성 주입한게 적용됩니다.
다음은 compose.yml 파일을 만들어주도록 하겠습니다.
services:
my-server:
build: .
ports:
- 8080:8080
depends_on:
my-db:
condition: service_healthy
my-cache-server:
condition: service_healthy
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: pwd1234
MYSQL_DATABASE: mydb
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck:
test: [ "CMD", "mysqladmin", "ping" ]
interval: 5s
retries: 10
my-cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
위 코드를 잠깐 해석해드리자면
우선 depends_on이라는 구문이 보이실겁니다.
이 구문은 컨테이너가 실행되기 전에 선행되어야 할 내용들을 입력하는 구문입니다.
즉, spring이 실행되기 전에 db와 redis가 실행되어야 spring에서 제대로 인식하여 동작할 수 있습니다.
다음은 spring과 db, redis를 연결할 수 있는 yml파일을 만들어주도록 하겠습니다.
spring:
datasource:
url: jdbc:mysql://my-db:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
data:
redis:
host: my-cache-server
port: 6379
그리고 Redis를 연결해주는 config파일을 생성하도록 하겠습니다
위 config파일에서 localhost에 저렇게 name을 지정해 준 이유는
각 컨테이너는 각자의 네트워크를 가지고 있기 때문에, localhost가 아닌 Redis가 실행되고 있는 컨테이너와 통신을 해야합니다. 컨테이너의 주소는 service이름으로 표현한다고 하였기때문에 redis의 컨테이너 주소인 service명을 입력해줌.
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
마지막으로 spring이 실행되었을 때 실행할 파일을 만들어주도록 하겠습니다.
@RestController
public class AppController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@GetMapping("/")
public String home() {
redisTemplate.opsForValue().set("abc", "def");
return "Hello, World!";
}
}
아참! 현재 test폴더 하위에있는 DemoApplicationTests.java파일이 존재하는데
이 파일은 가끔 충돌을 일으킬 수 있는 가능성이 있어 삭제하도록 하겠습니다
이제 모든 준비는 완료되었습니다.
만들어진 compose.yml파일을 기반으로 springboot,mysql,redis를 실행시켜보도록 하겠습니다.
우선 terminal이나 shell을 여셔서
./gradlew clean build를 입력하여 springboot프로젝트를 빌드시켜줍니다.
이후 compose파일을 실행시켜줍니다
docker compose up --build -d
하려는데 문제가 똬악!
에러를 읽어보니 docker .io/library/openjdk-jdk 라는 것을 인지를 못하는 것이였다.
그렇다.. Dockerfile에 오타가 있었던 것이였다.
FROM openjdk-jdk -> FROM openjdk:17-jdk로 수정 후 다시 실행하였습니다.
한번 더
docker compose up --build -d
docker ps -a
이번엔 제대로 실행된 것을 볼 수 있습니다.
출처 - 인프런 비전공자도 이해할 수 있는 Docker 입문/실전 중..
비전공자도 이해할 수 있는 Docker 입문/실전 강의 | JSCODE 박재성 - 인프런
JSCODE 박재성 | , 🤬 에라이, 못 해먹겠네!비전공자로 개발을 시작해 여러 회사에서 CTO로 활동하다가, 현재는 교육자로 활동하고 있는 박재성이라고 합니다. 저도 비전공자로 개발을 시작해 서버
www.inflearn.com
'IT지식 > 도커(Docker) 사용법' 카테고리의 다른 글
19.도커(Docker) Compose에 관련된 명령어 (0) | 2025.02.15 |
---|---|
18.도커(Docker) Compose의 정의와 사용법 (0) | 2025.02.15 |
17. 도커(Dokcer) WORKDIR 정의와 사용법 (0) | 2025.02.15 |
16. 도커(Docker) 명령어 RUN과 ENTRYPOINT 차이 (0) | 2025.02.15 |
15. 도커(Docker)로 스프링 부트(Spring Boot) 연동하여 실행하기 (1) | 2025.02.14 |