Avatar
๐Ÿ˜‰

Organizations

  • Spring์—์„œ๋Š” Servlet๊ณผ DispatcherServlet์ด ์›น ์š”์ฒญ ์ฒ˜๋ฆฌ์—์„œ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ด์š”. ๊ฐœ๋…์„ ํ•˜๋‚˜์”ฉ ๋ช…ํ™•ํžˆ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”.


    ๐Ÿงฑ 1. Servlet์ด๋ž€?

    โœ… ์ •์˜

    • ์ž๋ฐ” ์›น์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋„ŒํŠธ
    • HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , HTTP ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค
    • ํ†ฐ์บฃ(Tomcat) ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋จ

    โœ… ์—ญํ• 

    • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜จ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‘๋‹ต์„ ์ƒ์„ฑํ•จ
    • ์˜ˆ์ „์—๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ง์ ‘ Servlet์—์„œ ์ฒ˜๋ฆฌํ–ˆ์–ด์š”.
    @WebServlet("/hello")
    public class HelloServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) {
            response.getWriter().write("Hello from Servlet!");
        }
    }
    

    ์ด๊ฑด ๊ฑฐ์˜ Spring ์ด์ „์˜ ์ „ํ†ต์ ์ธ ์›น ๋ฐฉ์‹์ด์—์š”.

    Created Wed, 26 Mar 2025 08:19:45 +0900
  • Spring Boot์—์„œ Filter์™€ Interceptor๋Š” ๋ชจ๋‘ ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์„ ๊ฐ€๋กœ์ฑ„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ์—ญํ• , ์‹คํ–‰ ์‹œ์ , ์ ์šฉ ๋ฒ”์œ„์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ„๋‹จ + ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”.


    ๐Ÿ”น 1. Filter (์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ)

    โœ… ๊ฐœ์š”

    • Servlet ์ŠคํŽ™์— ์ •์˜๋œ ๊ธฐ๋Šฅ
    • Spring๋ณด๋‹ค ๋” ํ•˜์œ„ ๋ ˆ๋ฒจ
    • DispatcherServlet ์ด์ „์— ์‹คํ–‰๋จ

    โœ… ์‚ฌ์šฉ ์˜ˆ์‹œ

    • ์ธ์ฆ, ์ธ์ฝ”๋”ฉ, ๋กœ๊น…, XSS ๋ฐฉ์–ด
    • ๊ณตํ†ต ์ „์ฒ˜๋ฆฌ/ํ›„์ฒ˜๋ฆฌ

    โœ… ์˜ˆ์ œ

    @Component
    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            System.out.println("Filter: ์š”์ฒญ ์ „");
            chain.doFilter(request, response);
            System.out.println("Filter: ์‘๋‹ต ํ›„");
        }
    }
    

    ๐Ÿ”น 2. Interceptor (์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ)

    โœ… ๊ฐœ์š”

    • Spring MVC์˜ ๊ธฐ๋Šฅ
    • DispatcherServlet ์ดํ›„์— ๋™์ž‘
    • ์ฃผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์ง„์ž… ์ „/ํ›„์— ๋กœ์ง ์ ์šฉ

    โœ… ์‚ฌ์šฉ ์˜ˆ์‹œ

    • ๋กœ๊ทธ์ธ ์ฒดํฌ
    • ๊ถŒํ•œ ๊ฒ€์‚ฌ
    • ์š”์ฒญ ๋กœ๊น…
    • ๊ณตํ†ต ์‘๋‹ต ๊ฐ€๊ณต

    โœ… ์˜ˆ์ œ

    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            System.out.println("Interceptor: ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „");
            return true; // false๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์•ˆ ๋„˜์–ด๊ฐ
        }
    }
    

    ๊ทธ๋ฆฌ๊ณ  ๋“ฑ๋ก์€ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ•ด์š”:

    Created Wed, 26 Mar 2025 08:15:45 +0900
  • github action sample

    spring boot

    • gradle build๋ฅผ ์‚ฌ์šฉํ•˜๋Š” spring boot๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ssh๋กœ

    • secret ๋ฅ˜๋Š” setting-> security์— Secrets and variables ๋‚ด action ๋ฉ”๋‰ด์—์„œ ์„ค์ •

    • ๋งˆ์ง€๋ง‰์— slack webhook์œผ๋กœ ๋ฐฐํฌ ์ƒํ™ฉ ์•Œ๋ฆผ

    • action ์„ค์ •์ด๋‚˜ slack webhoook url ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—๋„ ๋งŽ์œผ๋‹ˆ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

      name: Build and Deploy
      
      on:
        push:
          branches:
            - develop
      
      jobs:
        build-and-deploy:
          runs-on: ubuntu-latest
      
          steps:
            # 1. SSH ํ˜ธ์ŠคํŠธ ํ‚ค ์ถ”๊ฐ€
            - name: Add SSH known hosts
              run: |
                mkdir -p ~/.ssh
                ssh-keyscan -H github.com >> ~/.ssh/known_hosts
      
            # 2. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ฒดํฌ์•„์›ƒ (์„œ๋ธŒ๋ชจ๋“ˆ ํฌํ•จ)
            - name: Checkout repository with submodules
              uses: actions/checkout@v3
              with:
                submodules: recursive
                ssh-key: ${{ secrets.PRIVATE_KEY_FOR_SUBMODULE }}
                fetch-depth: 0
      
            # 3. ์„œ๋ธŒ๋ชจ๋“ˆ ์ตœ์‹ ํ™”
            - name: Update submodules to the latest
              run: |
                git submodule update --init --recursive
                git submodule foreach git pull origin $(git rev-parse --abbrev-ref HEAD)
      
            # 4. JDK ์„ค์ •
            - name: Set up JDK 23
              uses: actions/setup-java@v3
              with:
                java-version: '23'
                distribution: 'temurin'
      
            # 5. Gradle ๋นŒ๋“œ
            - name: Build with Gradle
              run: ./gradlew clean build -x test
      
            # 6. ์„œ๋ฒ„๋กœ ํŒŒ์ผ ์ „์†ก
            - name: Deploy to Server
              env:
                SSH_PRIVATE_KEY: ${{ secrets.DEV_SSH_PRIVATE_KEY }}
                DEPLOY_SERVER_IP: ${{ secrets.DEV_SERVER_IP }}
                DEPLOY_SERVER_USER: ${{ secrets.DEV_SERVER_USER }}
              run: |
                echo "DEPLOY_SERVER_IP: $DEPLOY_SERVER_IP"
                mkdir -p ~/.ssh
                echo "$SSH_PRIVATE_KEY" > ~/.ssh/github_action
                chmod 600 ~/.ssh/github_action
                ssh-keyscan -H "$DEPLOY_SERVER_IP" >> ~/.ssh/known_hosts
      
                # ๋นŒ๋“œ ํŒŒ์ผ ์ „์†ก
                scp -i ~/.ssh/github_action build/libs/*.jar $DEPLOY_SERVER_USER@$DEPLOY_SERVER_IP:/home/$DEPLOY_SERVER_USER/backend/
      
                # swagger rest doc json
                # scp -i ~/.ssh/github_action build/resources/main/restdocs/*.json $DEPLOY_SERVER_USER@$DEPLOY_SERVER_IP:/home/$DEPLOY_SERVER_USER/swagger-docs/
                find build/resources/main/restdocs -name "*.json" | grep . && scp -i ~/.ssh/github_action build/resources/main/restdocs/*.json $DEPLOY_SERVER_USER@$DEPLOY_SERVER_IP:/home/$DEPLOY_SERVER_USER/swagger-docs/ || echo "No JSON files to copy, skipping..."
      
            # 7. ์„œ๋ฒ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
            - name: Start Application
              env:
                DEPLOY_SERVER_IP: ${{ secrets.DEV_SERVER_IP }}
                SERVER_USER: ${{ secrets.DEV_SERVER_USER }}
                REPOSITORY_NAME: ${{ github.repository }}
              run: |
                PROJECT_NAME=$(echo $REPOSITORY_NAME | cut -d'/' -f2)
                ssh -i ~/.ssh/github_action $SERVER_USER@$DEPLOY_SERVER_IP << EOF
                cd /home/$SERVER_USER/backend
                chmod 700 /home/$SERVER_USER/backend/${PROJECT_NAME}*-exec.jar 
                sh /home/$SERVER_USER/bin/deploy.sh $PROJECT_NAME dev /home/$SERVER_USER 512m
                sh /home/$SERVER_USER/infra/swagger/swagger_script.sh restart ${PROJECT}-api.json
                EOF
      
            - name: action-slack
              uses: 8398a7/action-slack@v3
              with:
                status: ${{ job.status }}
                author_name: Pink Spider - dev
                fields: repo,commit,message,author # action,eventName,ref,workflow,job,took ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
                mention: here
                if_mention: failure,cancelled
              env:
                SLACK_WEBHOOK_URL: ${{ secrets.DEV_SLACK_WEBHOOK_URL }} # required
              if: always() # Pick up events even if the job fails or is canceled.
      
    • deploy.sh

    Created Tue, 25 Mar 2025 18:01:05 +0900
  • git history ์ „๋ถ€ ์—†์• ๊ณ  reset ํ•˜๋Š” ๋ฐฉ๋ฒ•

    • git history ๋ฅผ ์™œ ์—†์• ์•ผ ํ• ๊นŒ?
      • ์ž์ฃผ์žˆ๋Š” ์ผ์€ ์•„๋‹ˆ์ง€๋งŒ, git history๋ฅผ ์ „๋ถ€ ๋‚ ๋ฆฌ๊ณ  reset ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค..
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ์•”๋ณตํ˜ธํ™” key, ๊ฐœ์ธ์ •๋ณด ๋“ฑ ๋…ธ์ถœ๋˜๋ฉด ๋ฏผ๊ฐ์ •๋ณด๋‚˜ ํŒŒ์ผ๋“ฑ์ด git์— ์˜ฌ๋ผ๊ฐ€ ๋ฒ„๋ ธ๋‹ค๋ฉด?
      • ํ•ด๋‹น ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ  ๋‹ค์‹œ commit & push๋ฅผ ํ–ˆ์ง€๋งŒ, history๋ฅผ ๋ณด๊ณ  ์ด์ „ commit์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๊ทธ๋งŒ์ด๋ฏ€๋กœ, ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์—†์ง€์š”.
      • ์•„์˜ˆ history๊นŒ์ง€ ๋‚ ๋ ค๋ฒ„๋ ค์„œ ์ด์ „์˜ ์‹ค์ˆ˜(๊ผญ ์‹ค์ˆ˜ํ–ˆ์„๋•Œ๋งŒ reset ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ)๋ฅผ ์ด๋ ฅ๊นŒ์ง€ ์ง€์›์‹œ๋‹ค.

    main ํ˜น์€ develop๋“ฑ ๋‚จ๊ฒจ๋†“์„ ๋ธŒ๋žœ์น˜์—์„œ (์—ฌ๊ธฐ์„  main)

    • –orphan ์€ ๊ธฐ์กด์ปค๋ฐ‹ ์ด๋ ฅ์—†์ด…์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ์กด ์ด๋ ฅ์—†์ด ์‹œ์ž‘ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      git checkout --orphan latest_branch
      

    ์ƒˆ๋กœ ์ปค๋ฐ‹

    git add .
    git commit -m "initial commit after reset"
    

    ๊ธฐ์กด ๋ธŒ๋žœ์น˜ ๋‚ ๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ฆ

    git branch -D main
    git branch -m main
    

    main์— force pushํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ •๋ฆฌํ•ด์„œ repo ์ตœ์ ํ™”

    git push -f origin main
    git gc --aggressive --prune=all
    

    image

    Created Mon, 24 Mar 2025 20:18:45 +0900
  • Clean Code 1์žฅ

    ํด๋ฆฐ ์ฝ”๋“œ์˜ ์กฐ๊ฑด- ๋‚ด ๋‚˜๋ฆ„์˜ ์ •๋ฆฌ

    • 1์žฅ์—์„œ๋Š” ์ž๋ฐ”๋‚˜ C ์ฐฝ์‹œ์ž๋“ฑ ๊ฐœ๋ฐœ๊ณ„์˜ ๊ฑฐ์žฅ๋“ค์ด ์ƒ๊ฐํ•˜๋Š” ์ข‹์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฒฌํ•ด๋ฅผ ๋ชจ์•„๋†“์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
    • ๋‹ค์Œ์€ ์ด ๋ถ„๋“ค์˜ ์˜๊ฒฌ์—์„œ ๋‚˜๋ฆ„ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์„ ์ถ”๋ ค์„œ ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
    • ์‚ฌ์‹ค์ƒ ์ฑ… ์ „์ฒด์— ๋…น์•„ ์žˆ๋Š” ๋‚ด์šฉ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

    SARAM

    • S : Simple

      • ๋‚ด ์˜๊ฒฌ : ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ฝ”๋“œ์— ๋…น์•„๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์ž์ฒด๋Š” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ์ฝ”๋“œ(ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ ์ฐจ์›)์ด๋ผ๋„ ์‹ฌํ”Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • A : Atomic

    Created Sat, 22 Mar 2025 20:16:08 +0900
  • AES ์•”๋ณตํ˜ธํ™”๋ฅผ ์œ„ํ•œ key์ƒ์„ฑ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ธฐ

    Contents

    AES ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•˜์—ฌ.

    • ์•”๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋Œ€ํ‘œ์ ์ธ ์–‘๋ฐฉํ–ฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
    • ์ž๋ฃŒ์ƒ์œผ๋กœ ์ฐพ์•„๋ณด๋ฉด AES(Advanced Encryption Standard)๋Š” ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์˜ ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋ฏธ๊ตญ ๊ตญ๋ฆฝํ‘œ์ค€๊ธฐ์ˆ ์—ฐ๊ตฌ์†Œ(NIST)์— ์˜ํ•ด 2001๋…„ ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ๋†’์€ ๋ณด์•ˆ์„ฑ๊ณผ ๋น ๋ฅธ ์„ฑ๋Šฅ ๋•๋ถ„์— ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    AES ํŠน์ง•

    • ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™”: ๋™์ผํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณ ์ •๋œ ๋ธ”๋ก ํฌ๊ธฐ: AES๋Š” 128๋น„ํŠธ ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค์–‘ํ•œ ํ‚ค ๊ธธ์ด ์ง€์›: 128๋น„ํŠธ, 192๋น„ํŠธ, 256๋น„ํŠธ ํ‚ค ๊ธธ์ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณด์•ˆ์„ฑ: ๊ธฐ์กด์˜ DES(Data Encryption Standard)๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ฑ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ๋น ๋ฅธ ์†๋„: ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ํ•˜๋“œ์›จ์–ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    AES ์•”ํ˜ธํ™” ๊ณผ์ •

    • AES ์•”ํ˜ธํ™”๋Š” ์—ฌ๋Ÿฌ ๋ผ์šด๋“œ(Round)์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ํ‚ค ๊ธธ์ด์— ๋”ฐ๋ผ ๋ผ์šด๋“œ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

    Created Thu, 20 Mar 2025 16:18:45 +0900