1. 스프링 부트 프로젝트 만들기
빌드 툴은 gradle이므로 build.gradle.kts에 spring-boot-starter-web 의존성을 추가하고 테스트할 수 있는 맵핑을 하나 만들어주면 됩니다.
@RestController
@RequiredArgsConstructor
class NotificationController {
@Autowired
val firebaseService = FirebaseService()
@Autowired
val fCMService = FCMService()
@Throws(IOException::class)
@PostMapping("/sendNotification")
fun sendNotification(@RequestBody requestDTO: RequestDTO): ResponseEntity<String> {
// FirebaseInitialize().initialize()
// firebaseService.getUserToken()
fCMService.sendMessageTo(requestDTO.targetToken, requestDTO.title, requestDTO.body)
return ResponseEntity.ok().build()
}
@GetMapping("/{testValue}")
fun test(@PathVariable(name = "testValue") test : String): String{
return "testvalue is $test"
}
}
기존에 만든 스프링부트 프로젝트입니다. 변수를 GET방식으로 받아서 리턴해줍니다.
2. DockerFile 만들기
Dockerfile은 컨테이너에 설치해야 하는 패키지, 소스코드, 명령어, 환경변수 설정 등을 기록한 하나의 파일입니다.
docker build 명령어를 통해서 Docker가 DockerFile을 읽어서 자동으로 도커 이미지를 빌드합니다.
#FROM adoptopenjdk:11-jdk-hotspot AS builder
# the latest OpenJDK 8 with HotSpot JDK image + 빌드용
FROM adoptopenjdk:16-jdk-hotspot AS builder
# 배포용
COPY gradlew .
COPY settings.gradle.kts .
COPY build.gradle.kts .
COPY gradle gradle
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJar
FROM adoptopenjdk:16-jre-hotspot
# the latest OpenJDK 8 with HotSpot JRE image + 배포용
# 만들어진 파일(ex. demo-0.0.1-SNAPSHOT.jar)을 spring-boot-application.jar파일명으로 복사한다
RUN mkdir /opt/app
COPY --from=builder build/libs/*.jar /opt/app/spring-boot-application.jar
EXPOSE 8008
ENTRYPOINT ["java", "-jar", "/opt/app/spring-boot-application.jar"]
- DockerFile은 최상위 디렉토리에 만들어야 합니다. 파일 이름은 Dockerfile이라고 저장해야 합니다.
- DockerFile에 정의한 순서대로 읽어서 Docker 데몬에 해당 명령어를 실행합니다.
- 반드시 FROM키워드로 시작해야 합니다.
- ARG 키워드는 Argument로 JAR_FILE_PATH라는 변수명에 target/*. jar 경로를 담았다.
- COPY키워드는 위에서 할당한 변수명을 spring-boot-application.jar이름으로 복사했다.
- ENTRYPOINT는 java를 실행하는 parameter를 담았다.
Dockerfile reference
docs.docker.com
3. window에 Docker설치
Install Docker Desktop on Windows
docs.docker.com
도커 설치하기 전 시스템 요구사항을 확인하셔야 합니다.
window 11 : Home or Pro or Enterprise or Education version 21H2 of higher
wsl(window subsystem for linux)이 사용 가능해야 합니다. WSL를 설치해야 하는데 최신 업데이트면 자동 설치, 안되면 수동 설치로 하면 됩니다.
64비트 프로세서, 4기가 램, BIOS 레벨에서 하드웨어 가상화 지원이 가능해야 합니다. 여기서 설정할 수 있습니다.
WSL2 설치
이제 관리자 권한으로 명령 프롬프트를 열어서 아래 명령어를 입력해줍니다.
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
작업 완료됐다면 재부팅해줍니다.
이제 x64 시스템용 WSL2 Linux 커널 업데이트 패키지를 설치해줍니다.
설치가 완료됐다면 명령 프롬프트를 열어서 wsl2를 쓰도록 변경해줍니다.
wsl --set-default-version 2
다 됐습니다.
Docker 설치
이제야 Docker를 설치할 수 있습니다
Home - Docker
Learn how Atomist will help Docker meet the challenge of securing secure software supply chains for development teams.
www.docker.com
홈페이지에서 설치 파일을 받아줍니다.
설치 중간에 Configuration이 나오는데 둘 다 체크하고 OK를 눌러줍니다.
설치가 되고 있습니다
설치 다되면 로그아웃하라고 파란 버튼이 나오는데 클릭하는 바람에 캡처 못했습니다.
빛나는 문어랑 고래가 반겨주네요
윈도 도커 창입니다 이까지 오셨다면 축하드립니다. 이제 절반 오셨어요.
4. DockerFile로 이미지 빌드
이제 프로젝트 IDE에서 터미널을 실행시켜 이미지 빌드를 할 차례입니다.
docker build -t isyousleep:0.0.1 .
build 명령어로 빌드를 실행하고 -t 명령어로 <이름>:<버전> 태그를 만들어서 빌드해줍니다.
※ 에러
빌드하는 프로젝트가 FCM을 이용하고 있는데 키가 담긴 json파일을 읽는데 문제가 생겼습니다.
java.io.FileNotFoundException: src/main/resources/serviceAccountKey/serviceAccountKey.json (No such file or directory)
jar에서 serviceAccountKey.json파일을 못 찾네요. 경로 쪽에서 문제가 생긴 거 같은데 찾아봅시다.
//엑세스 토큰 가져옴
@Throws(IOException::class)
private fun getAccessToken(): String{
val firebaseConfigPath = "src/main/resources/serviceAccountKey/serviceAccountKey.json"
val inputStream = FileInputStream(firebaseConfigPath)
val googleCredentials = GoogleCredentials
.fromStream(inputStream)
.createScoped(listOf("https://www.googleapis.com/auth/cloud-platform"))
googleCredentials.refreshIfExpired()
return googleCredentials.accessToken.tokenValue
}
구글링 결과 Firebase예제에 있는 코드는 로컬 환경을 상정하고 짜인 코드라 File System에서 찾고 있습니다.
jar파일은 일종의 압축 파일이기 때문에 File System에서는 찾을 수 없는 방식입니다.
해결방법
//엑세스 토큰 가져옴
@Throws(IOException::class)
private fun getAccessToken(): String{
val firebaseConfigPath = "src/main/resources/serviceAccountKey/serviceAccountKey.json"
val inputStream = resourceLoader.getResource(firebaseConfigPath).inputStream
val googleCredentials = GoogleCredentials
.fromStream(inputStream)
.createScoped(listOf("https://www.googleapis.com/auth/cloud-platform"))
googleCredentials.refreshIfExpired()
return googleCredentials.accessToken.tokenValue
}
FileInputStream대신에 InputStream을 사용하면 됩니다.
※ 에러
Could not open ServletContext resource [/src/main/resources/serviceAccountKey/serviceAccountKey.json]
하나를 해결하면 새로운 에러가 나네요. 경로를 따라 읽었지만 리소스를 열 수 없다고 나오네요.
해결방법
혹시나 절대 경로를 입력한 게 문제인가 싶어서 최상위 경로를 나타내는 classpath로 변경했습니다.
//엑세스 토큰 가져옴
@Throws(IOException::class)
private fun getAccessToken(): String{
// val firebaseConfigPath = "src/main/resources/serviceAccountKey/serviceAccountKey.json"
// val inputStream = FileInputStream(firebaseConfigPath)
val firebaseConfigPath = "classpath:/serviceAccountKey/serviceAccountKey.json"
val inputStream = resourceLoader.getResource(firebaseConfigPath).inputStream
val googleCredentials = GoogleCredentials
.fromStream(inputStream)
.createScoped(listOf("https://www.googleapis.com/auth/cloud-platform"))
googleCredentials.refreshIfExpired()
return googleCredentials.accessToken.tokenValue
}
결과
무사히 post 됐습니다.
5. Intellij의 docker플러그인 활용해서 DockerHub에 푸시
Intelli J로 DockerHub에 이미지를 올려서 라즈베리 파이나 EC2에서 받기 편하게 만들어봅시다.
1. 도커 플러그인 설치
도커 플러그인을 설치해줍니다.
2. 서비스 탭에 추가
Setting -> Build, Excution, Deployment -> Docker에서 추가해줍니다.
3. 로컬 Docker랑 연결
추가해주면 Service영역에 Docker창이 떠있습니다.
Connect 하면 DockerDesktop에 있는 이미지와 컨테이너를 확인할 수 있습니다.
4. 이미지 푸시
도커 허브 계정 정보를 입력해줍니다.
레포지토리 이름과 태그( 버전 정보)를 입력하고 OK를 눌러줍니다.
5. 확인
정상적으로 푸시된 것을 확인할 수 있습니다.
후기
경로 문제 때문에 4일 동안 고생했는데 해결하고 나니까 후련하네요
참고
Spring Boot, Dockerfile로 이미지 생성, 배포하기
SpringBoot프로젝트, Dockerfile을 만들어서 이미지를 생성하고 배포해보자!
umanking.github.io
자바에서 classpath
시작하며 JUnit을 이용하여 서비스 객체를 테스트할 일이 생겼다. 모든 빈을 등록하도록 스프링 컨테이너를 로드하기위해 아래와 같이 스프링 관련 설정을 읽어오도록 해야한다. 내가 겪었던 어
velog.io
Spring Boot - jar 안의 파일 읽을 때 FileNotFoundException
일반적으로 Spring Boot는 resources에 파일을 위치시킵니다. resources 하위에 text 파일을 Spring에서 제공하는 ResourceLoader를 이용하여 Read 하는 코드가 있습니다. import org.springframework.beans.facto..
yjh5369.tistory.com
'라즈베리파이' 카테고리의 다른 글
파이 한글 깨짐 해결 및 입력기 설치 (0) | 2022.11.18 |
---|---|
[docker] 포트 포워딩 설정하기 (1) | 2022.10.26 |
[docker]라즈베리 파이에 도커 설치하기 (1) | 2022.10.25 |
파이 보안 조치를 해보자 (0) | 2022.09.02 |
라즈베리 파이4 설치 및 초기설정 (0) | 2022.09.01 |