[인프런 워밍업 클럽 3기 백엔드 ]발자국 4주차

[인프런 워밍업 클럽 3기 백엔드 ]발자국 4주차

해당 글은 ‘입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기(정보근)’ 강의 를 수강하고 작성한 내용입니다.

https://www.inflearn.com/course/입문자-spring-boot-kotlin-포트폴리오/dashboard

📝 강의 내용 정리


[실습] 스프링 시큐리티 로그인 개발

  • 스프링 시큐리티를 사용하기 위해선 의존성 추가 필수

    build.gradle.kts

    	//스프링 시큐리티
    	implementation("org.springframework.boot:spring-boot-starter-security")
    	implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6")
    	testImplementation("org.springframework.security:spring-security-test")
    
    • 의존성이 추가되면 프로젝트의 모든 경로를 호출할 때 로그인을 요구함

  • AdminSecurityConfiguration

    해당 설정 클래스에서 스프링 시큐리티를 사용하기 위해 필요한 Bean들을 생성

    • BCryptPasswordEncode: BCrypt 해시 함수를 이용해 암호화된 비밀번호를 생성하는 비밀번호 인코더. 단방향 해시 함수로서 입력된 데이터를 일정한 길이의 해시값으로 변환함

    • SecurityFilterChain: 프로젝트의 보안 필터를 체인 형태로 구성

    • .requestMatchers(AntPathRequestMathcer(”경로”)

      해당 경로에 대해서만 시큐리티를 요구

    • formLogin :

  • 관리자 정보를 저장을 할 테이블 생성 → entity/Account.class

    UserDetials인터페이스를 상속받아서 생성 → 해당 클래스에 어카운트에 관련된 메서드들 정의되어 있음

    • override fun getAuthorities(): MutableCollection<out GrantedAuthority> = mutableListOf(SimpleGrantedAuthority("ADMIN"))

      유저의 Role부여

    • 계정 관리자가 1명이라는 가정하에 유효계정 체크 등의 기능은 다 true로 리턴

  • AdminSecurityService/Repository

    • 레포지퇴에서 로그인 정보로 계정 찾는 메서드 생성

    • 서비스에선 로그인 정보로 계정을 찾는 로직 작성

      (= 이후 검증 로직은 스프링 시큐리티 내부에 구현되어있음!)

  • 데이터이니셜라이저에 넣을 비밀번호를 테스트를 통해 얻어옴

    테스트코드에 BcryptPasswordEncoder를 사용해서 암호 하나 생성 → 생성된 암호 해시코드를 데이터이니셜라이저 코드에 삽입

[실습] Docker로 MySQL 실행하기

  • 도커를 실행시키려면 커맨드 라인 인터페이스를 활용해야 하는데 매번 터미널에 명령어를 치는 일은 번거로움

  • Docker Compose

    미리 정의된 파일을 작성해 두면 그 파일의 내용대로 도커 명령어를 생성해서 실행시켜줌

    • 도커 컴포즈에는 데이터베이스 비밀번호가 필요함

    • 데이터 베이스 비밀번호가 깃에 올라가면 안돼기 때문에 해당 파일은 로컬에서만 저장하도록

  • docker-compose.yml 파일 설명

    version: '2'
    services:
    	mysql:
    		image: mysql
    		container_name: mysql
    		ports:
    			- "3306:3306"
    		environment:
    			- "MYSQL_ROOT_PASSWORD=dkssudgktpdy"
    			- "TZ=Asia/Seoul"
    			- "LC_ALL=C.UTF-8"
    		command:
    			- --character-set-server=utf8mb4
    		volumes:
    			- /var/lib/docker/volumes/mysql/_data:/var/lib/mysql
    
    • version: 도커 버전

    • service: 현재 프로젝트의 서비스를 구성

    • image: 이미지 이름

    • container_name: 컨테이너 이름

      → 도커 허브에서 해당이름의 이미지를 찾아서 다운받은 후 컨테이너를 생성함

    • port

      호스트포트: 컨테이너포트

      • 호스트 포트: 도커 컨테이너가 돌아가는 컴퓨터의 포트

      • 컨테이너 포트: 컨테이너 내부에 있는 포트

      ⇒ 도커 안에 컨테이너를 컨테이너 포트로 띄움, 해당 포트를 로컬의 호스트 포트와 연결

    • enviroment

      환경변수 입력, 비밀번호와 시간대 설정,

    • volumns

      로컬 컨테이너에 있는 디렉토리와 도커 컨테이너 내부의 디렉토리를 연결

      → 그래서 만약 컨테이너를 지웠다가 다시 실행해도 같은 볼륨에 마운트가 되어서 데이터를 유지하고 계속 사용할 수 있음

  • 도커 실행방법

    터미널에서 실행시키기

    or

    인텔리제이(도커 플러그인이 깔려있을 시) 내부에서 실행

[실습] Docker로 프로젝트 빌드하기

  • DockerFile

    FROM openjdk:17
    
    LABEL maintainer="pyy2114@gmail.com"
    
    VOLUME /tmp
    
    EXPOSE 8080
    
    ARG JAR_FILE=build/libs/portfolio-0.0.1-SNAPSHOT.jar
    
    ADD ${JAR_FILE} portfolio-yoon.jar
    
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar", "/portfolio-yoon.jar"], "-jar", "/portfolio-yongback.jar"]
    
  • 도커 빌드 설정

    image.png

    • 인텔리제이로 Dockerfile을 실행할 경우 Edit Configurations에서 아래 옵션을 넣어줍니다.

    • Image Tag: {도커 아이디}/{이미지명}

    • Build options: --platform linux/amd64

      • Apple Silicon 맥북(M1 등)을 사용하는 경우 넣어주세요.

    • Run Gradle task 'portfolio: clean'

    • Run Gradle task 'portfolio: build'

    ⇒ 도커 빌드 시키면 도커 이미지 파일 생성됨

  • 도커 이미지 파일을 가지고 컨테이너를 만들어서 실행

    • docker-compose.yml

      version: '2'
      services:
        mysql:
          image: mysql
          container_name: mysql
          ports:
            - "3306:3306"
          environment:
            - "MYSQL_ROOT_PASSWORD=dkssudgktpdy"
            - "TZ=Asia/Seoul"
            - "LC_ALL=C.UTF-8"
          command:
            - --character-set-server=utf8mb4
          volumes:
            - /var/lib/docker/volumes/mysql/_data:/var/lib/mysql
        portfolio-yoon:
          image: pyy2114/portfolio-yoon
          container_name: portfolio-yoon
          ports:
            - "8080:8080"
          environment:
            - "SPRING_PROFILES_ACTIVE=docker"
            - "jasypt.encryptor.key=q1w2e3"
          volumes:
            - /var/lib/docker/volumes/portfolio-yoon/_data:/tmp
          depends_on:
            - mysql
      
    • portfolio-yoon: 생성한 이미지 이름

    • ports: 스프링부트 기본 포트인 8080

    • environment

      스프링 프로파일 설정 → docker로 설정되어있으니 application-docker.yml이 프로파일로 실행되어서 해당 환경변수로 셋팅

      • "jasypt.encryptor.key=q1w2e3"

        db패스워드가 환경변수 타입에 노출되면 안되기 때문에 jasypt라는 라이브러리로 암호화해서 전달할 예정(해당 비밀번호는 암호화 키? 값임, 실제 암호화할 데이터는 안보여질 예정)

        → 암호화된 값을 application-docker.yml파일에 넣어주면 됨

          datasource:
            username: root
            url: jdbc:mysql://mysql:3306/portfolio
            password: ENC(암호화된 비밀번호 작성)
            driver-class-name: com.mysql.cj.jdbc.Driver
        
    • depends_on: mysql이 먼저 실행되어야 정상적으로 동작하므로 순서를 지정해줌

  • Jasypt 구현

    1. build.gradle에 의존성 주입

      implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5")

    2. domain/configuration에 JasyptConfiguration 클래스 작성

  • 다 작성한 후 Dockerfile 빌드(이미지 생성) → dock-compose.yml 실행(도커실행)

  • localhost:8080으로 접속해서 제대로 뜨는지 확인

    (만약 오류 발생시 이제는 인텔리제이에서 보는게 아니라 도커에서 로그 확인)

미션


[미션6] 가상 프로필을 나의 프로필로 바꾸기


미션 6은 꽤나 간단한 미션이였다. 기존 datainitializer에 있는 데이터들을 나의 데이터로 바꿔놓는거였다. 그래서 관련 데이터로 바꿔놓고, 데이터 변경하는 김에 프로필 이미지도 바꿔놓았다.

나름 열심히 사이즈를 조절해서 pc에선 알맞게 맞춰놨는데 모바일 화면에서는 깨져나왔다. css로 사이즈를 변경해야되나 싶다..

[미션7] 배포한 프로젝트 공유하기


드디어 마지막 미션이다. 수업을 따라하면서 도커 이미지 생성과 컨테이너 배포는 완료를 했었지만, 바뀐 데이터를 적용하기 위해 다시 배포를 하였다. 배포를 혼자서는 처음 해보는데 확실히 도커로 빌드를 하니 간편했다. 이미 배포한 후 다시 배포하는 순서는 다음과 같이 정했다. 도커 이미지 재빌드 → 도커 허브에 push → 구글 클라우드에서 해당 이미지 pull → 컨테이너 재실행 위의 방법대로 진행하니 무리없이 배포를 진행할 수 있었다. 구글 클라우드도 처음 써봤는데, 강의를 보고해서 그런건진 몰라도 심플하게 배포가 가능했던 것 같다. 배포를 하고 테스트를 하면서 느낀점이 있는데 페이지 로드가 너무 느리다는 것이다. 무료 버전을 써서 그런건지 정확한 이유는 모르겠지만 현재 프로젝트는 모든 페이지 로드 시간이 너무 길다. 이 이유를 분석하고 해결해보는 것도 좋은 공부가 될 것 같다는 생각이 들었다.

📅4주차 회고


이번주는 수업과 미션 모두 도커를 이용해 이미지 생성하고 컨테이너를 실행해서 서버를 배포하는 작업이 주 였다. 처음엔 강의 시간을 보고 따라하기만 하면 되니 쉽게 할 수 있을 줄 알았는데 처음 다뤄보는 툴과 플랫폼이다 보니 많이 허덕였다. 그래서 생각보단 배포에 시간이 오래걸렸다. 하지만 한번 하고 나니 도커에 한번 올려놓기만 하면 쉽게 배포가 되어 다시 따라해보는데도 별로 어렵지 않았다. 이래서 다들 도커를 쓰나보다.. 이제 수업과 미션은 다 끝났고 개인 프로젝트 개발만 남았다. 남은 시간동안 짬을 내어 최대한 완성해보고 싶다.

마지막 발자국이여서 워밍업 클래스의 전체적인 회고를 해보자면 확실히 모니터링 해주는 사람들이 있고, 기간 등이 정해져 있다 보니 다른 인강을 들을 때보다 더 부지런하게 진행했던 것 같다. 매주 주어지는 미션들도 그 주에 배운 내용들을 복습하기 좋았다. 해당 프로젝트 덕분에 한 달을 나름 알차게 보낸 것 같아 마음이 좋다. 강의에서 배운 지식들을 토대로 실력을 더 디벨롭 시키는 좋은 경험이였다.

댓글을 작성해보세요.

채널톡 아이콘