Skip to content

Conversation

@J2H3233
Copy link
Contributor

@J2H3233 J2H3233 commented Dec 19, 2025

πŸ—£οΈ 이슈 번호

closed #91

πŸ“ λ―Έμ…˜ 번호

10μ£Όμ°¨ Misson 1

πŸ“‹ κ΅¬ν˜„ 사항

  • μ›Œν¬ν”Œλ‘œμš° μΆ”κ°€

πŸ“Ž μŠ€ν¬λ¦°μƒ·

image image image image

βœ… 체크리슀트

  • Assignees에 본인을 선택 ν–ˆλ‚˜μš”?
  • Merge ν•˜λ €λŠ” λΈŒλžœμΉ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ˜μ–΄ μžˆλ‚˜μš”?
  • λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν–ˆμ„ λ•Œ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šλ‚˜μš”?
  • λΆˆν•„μš”ν•œ 주석이 μ œκ±°λ˜μ—ˆλ‚˜μš”?
  • μ½”λ“œ μŠ€νƒ€μΌμ΄ μΌκ΄€μ μΈκ°€μš”?

πŸ€” 질문 사항

@J2H3233 J2H3233 requested a review from hardwoong December 19, 2025 02:09
@J2H3233 J2H3233 self-assigned this Dec 19, 2025
@J2H3233 J2H3233 added the enhancement New feature or request label Dec 19, 2025
Copy link
Member

@hardwoong hardwoong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GitHub Actions와 AWS EC2λ₯Ό μ΄μš©ν•œ CI/CD 배포, 그리고 EC2 ν™˜κ²½μ—μ„œμ˜ Google 둜그인 문제 ν•΄κ²°κΉŒμ§€ λͺ¨λ‘ 잘 ν•΄κ²°ν•˜μ…¨μŠ΅λ‹ˆλ‹€.


1. CI/CD 배포 νŒŒμ΄ν”„λΌμΈ ꡬ좕

GitHub Actions와 AWS EC2λ₯Ό μ—°λ™ν•˜μ—¬ μžλ™ 배포 μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜μ…¨μŠ΅λ‹ˆλ‹€. μ½”λ“œλ₯Ό ν‘Έμ‹œν•˜λ©΄ μžλ™μœΌλ‘œ λ°°ν¬λ˜λŠ” ν™˜κ²½μ€ ν”„λ‘œμ νŠΈ ν™˜κ²½μ—μ„œ νŽΈλ¦¬ν•˜κ²Œ μž‘μš©ν•©λ‹ˆλ‹€.

  • GitHub Actions μ›Œν¬ν”Œλ‘œμš°λ₯Ό ν†΅ν•œ μžλ™ 배포 μ‹œμŠ€ν…œ ꡬ좕
  • EC2 μΈμŠ€ν„΄μŠ€μ— μžλ™ λ°°ν¬λ˜λŠ” νŒŒμ΄ν”„λΌμΈ ꡬ성
  • 배포 ν™˜κ²½μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ λ™μž‘

2. Google 둜그인 배포 ν™˜κ²½ 문제 ν•΄κ²°

EC2 배포 ν™˜κ²½μ—μ„œ Google 둜그인이 λ™μž‘ν•˜μ§€ μ•Šμ•˜λ˜ 문제λ₯Ό 잘 ν•΄κ²°ν•˜μ…¨μŠ΅λ‹ˆλ‹€. googleStrategy.jsλ₯Ό λ³΄λ‹ˆ callbackURL이 μƒλŒ€ 경둜둜 μ„€μ •λ˜μ–΄ μžˆμ–΄, ν˜„μž¬ ν˜ΈμŠ€νŠΈμ— μžλ™μœΌλ‘œ λ§€ν•‘λ˜μ–΄ 개발/ν”„λ‘œλ•μ…˜ ν™˜κ²½ λͺ¨λ‘μ—μ„œ λ™μž‘ν•  수 μžˆλ„λ‘ 잘 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€!

ν•΄κ²° 방법:

  • Google OAuth λ¦¬λ‹€μ΄λ ‰νŠΈ URIλ₯Ό μƒλŒ€ 경둜(/api/v1/auth/google/callback)둜 μ„€μ •
  • Google Cloud Consoleμ—μ„œ ν•΄λ‹Ή 도메인을 λ¦¬λ‹€μ΄λ ‰νŠΈ URI둜 등둝
  • μƒλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν˜„μž¬ ν˜ΈμŠ€νŠΈμ— μžλ™μœΌλ‘œ λ§€ν•‘λ˜μ–΄ ν™˜κ²½μ— 따라 μœ μ—°ν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€

μ½”λ“œ ꡬ성:

// src/middlewares/passport/googleStrategy.js
export const googleStrategy = new GoogleStrategy(
  {
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: '/api/v1/auth/google/callback', // μƒλŒ€ 경둜 μ‚¬μš©
    scope: ['email', 'profile'],
  },
  async (accessToken, refreshToken, profile, done) => {
    // ...
  }
);

특히 인상적인 점:

  • μƒλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν™˜κ²½μ— 따라 μœ μ—°ν•˜κ²Œ λ™μž‘ν•˜λ„λ‘ κ΅¬μ„±ν•œ 점이 μ’‹μŠ΅λ‹ˆλ‹€!
  • Google 둜그인 μ‹œ κΈ°μ‘΄ μ‚¬μš©μžμ˜ 정보λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 둜직이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€

배포 ν™˜κ²½μ—μ„œμ˜ Google OAuth μ„€μ •

핡심 포인트:

  • Google OAuthλŠ” IP μ£Όμ†Œμ™€ 포트 번호 ν˜•νƒœ(43.201.11.212:3000)의 λ¦¬λ‹€μ΄λ ‰νŠΈ URIλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
  • λ”°λΌμ„œ 도메인을 μ‚¬μš©ν•˜λŠ” 것이 ν•„μˆ˜μž…λ‹ˆλ‹€
  • μƒλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν˜„μž¬ ν˜ΈμŠ€νŠΈμ— μžλ™μœΌλ‘œ λ§€ν•‘λ˜μ–΄ 개발/ν”„λ‘œλ•μ…˜ ν™˜κ²½ λͺ¨λ‘μ—μ„œ λ™μž‘ν•©λ‹ˆλ‹€
  • callbackURL을 μƒλŒ€ 경둜둜 μ„€μ •ν•˜κ³ , Google Cloud Consoleμ—μ„œλ„ 도메인 ν˜•νƒœλ‘œ 등둝해야 ν•©λ‹ˆλ‹€

ν˜„μž¬ μ„€μ •:

callbackURL: '/api/v1/auth/google/callback'; // μƒλŒ€ 경둜 μ‚¬μš©

이 섀정이 μ˜¬λ°”λ₯΄κ²Œ μ μš©λ˜μ–΄ Google 둜그인이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€!

도메인 μ„€μ • κ³Όμ •:

  1. 도메인 DNS μ„€μ •

    • 도메인 μ œκ³΅μ—…μ²΄(예: λ‚΄λ„λ©”μΈν•œκ΅­)μ—μ„œ λ„λ©”μΈμ˜ A λ ˆμ½”λ“œλ₯Ό EC2 μΈμŠ€ν„΄μŠ€μ˜ 퍼블릭 IP μ£Όμ†Œλ‘œ μ„€μ •
    • μ΄λ ‡κ²Œ ν•˜λ©΄ 도메인이 EC2 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€κ²Œ λ©λ‹ˆλ‹€
  2. Google Cloud Console μ„€μ •

    • Google Cloud Consoleμ—μ„œ OAuth λ¦¬λ‹€μ΄λ ‰νŠΈ URIλ₯Ό 도메인 ν˜•νƒœλ‘œ 등둝
    • 예: http://your-domain.com/api/v1/auth/google/callback λ˜λŠ” https://your-domain.com/api/v1/auth/google/callback
    • IP μ£Όμ†Œ ν˜•νƒœλŠ” Google OAuthμ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 도메인을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€
  3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ

    • EC2 ν™˜κ²½μ—μ„œλŠ” μ½”λ“œ 변경이 ν•„μš” μ—†μŠ΅λ‹ˆλ‹€
    • callbackURL: "/api/v1/auth/google/callback"둜 μƒλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜λ©΄, ν˜„μž¬ 도메인에 μžλ™μœΌλ‘œ λ§€ν•‘λ©λ‹ˆλ‹€

κ°œμ„ μ΄ ν•„μš”ν•œ 점

1. updateUserInfo ν•¨μˆ˜κ°€ importλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€

문제점:

googleStrategy.jsμ—μ„œ updateUserInfo ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ, importλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

// src/middlewares/passport/googleStrategy.js
} else {
    user = await updateUserInfo(user.id,{
        name: name,
        snsId: snsId,
    })
}

κ°œμ„  λ°©μ•ˆ:

updateUserInfo ν•¨μˆ˜λ₯Ό importν•˜κ±°λ‚˜, ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

// src/middlewares/passport/googleStrategy.js
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import { findByEmail } from '../../repositories/auth.repository.js';
import {
  SocialRegisterService,
  updateUserInfo,
} from '../../services/auth.service.js'; // updateUserInfo μΆ”κ°€
import { Provider } from '@prisma/client';

λ˜λŠ” updateUserInfo ν•¨μˆ˜κ°€ auth.service.js에 μ—†λ‹€λ©΄, ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.


마무리

이번 λ―Έμ…˜μ„ 톡해 μ‹€μ œ ν”„λ‘œλ•μ…˜ ν™˜κ²½ 배포의 μ „ 과정을 κ²½ν—˜ν•˜μ…¨μŠ΅λ‹ˆλ‹€. CI/CD νŒŒμ΄ν”„λΌμΈ ꡬ좕뢀터 도메인 μ„€μ •, OAuth μΈμ¦κΉŒμ§€ λͺ¨λ‘ λ‹€λ£¨μ…¨μŠ΅λ‹ˆλ‹€!

특히 Google OAuth λ¦¬λ‹€μ΄λ ‰νŠΈ URIλ₯Ό μƒλŒ€ 경둜둜 μ„€μ •ν•˜μ—¬ ν™˜κ²½μ— 따라 μœ μ—°ν•˜κ²Œ λ™μž‘ν•˜λ„λ‘ κ΅¬μ„±ν•˜μ‹  점이 μΈμƒμ μž…λ‹ˆλ‹€. Google 둜그인 μ‹œ κΈ°μ‘΄ μ‚¬μš©μž 정보λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” λ‘œμ§μ„ ν¬ν•¨ν•˜μ‹  점도 μ’‹μŠ΅λ‹ˆλ‹€!

μ—¬λŸ¬ 번의 μ‹œλ„ 끝에 μ„±κ³΅ν•œ GitHub Actions μ›Œν¬ν”Œλ‘œμš°λ„ 고생 λ§ŽμœΌμ…¨μŠ΅λ‹ˆλ‹€!


참고사항

HTTPS μ„€μ • ꢌμž₯:

  • ν˜„μž¬ HTTP둜 λ™μž‘ν•˜κ³  μžˆλ‹€λ©΄, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” HTTPSλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 λ³΄μ•ˆμƒ μ•ˆμ „ν•©λ‹ˆλ‹€
  • AWS Certificate Manager(ACM)λ₯Ό μ‚¬μš©ν•˜μ—¬ SSL/TLS μΈμ¦μ„œλ₯Ό λ°œκΈ‰λ°›κ³ , Application Load Balancerλ‚˜ CloudFront와 μ—°λ™ν•˜μ—¬ HTTPSλ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€
  • λ˜λŠ” Let's Encryptλ₯Ό μ‚¬μš©ν•˜μ—¬ 무료 SSL μΈμ¦μ„œλ₯Ό λ°œκΈ‰λ°›μ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ (μ €λŠ” 이 방법을 더 μ„ ν˜Έν•©λ‹ˆλ‹€! 더 νŽΈν•΄μ„œ..)

λ³΄μ•ˆ κ·Έλ£Ή 확인:

  • AWS EC2 λ³΄μ•ˆ κ·Έλ£Ή μ„€μ •μ—μ„œ HTTPS(443 포트)κ°€ μ—΄λ €μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”
  • ν•„μš”ν•˜λ‹€λ©΄ HTTP(80 포트)도 μ—΄μ–΄λ‘λ˜, κ°€λŠ₯ν•˜λ©΄ HTTPS둜 λ¦¬λ‹€μ΄λ ‰νŠΈν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€

ν™˜κ²½ λ³€μˆ˜ 관리:

  • 개발 ν™˜κ²½κ³Ό ν”„λ‘œλ•μ…˜ ν™˜κ²½μ˜ 섀정을 ν™˜κ²½ λ³€μˆ˜λ‘œ κ΄€λ¦¬ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€
  • ν˜„μž¬ μƒλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ–΄ callbackURL은 ν™˜κ²½ λ³€μˆ˜λ‘œ 관리할 ν•„μš”κ°€ μ—†μ§€λ§Œ, λ‹€λ₯Έ μ„€μ •λ“€(예: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET)은 ν™˜κ²½ λ³€μˆ˜λ‘œ κ΄€λ¦¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€

PM2 λ˜λŠ” ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ € μ‚¬μš©:

  • ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” PM2λ‚˜ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ λ§€λ‹ˆμ €λ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΄€λ¦¬ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€
  • systemd μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것도 쒋은 μ„ νƒμž…λ‹ˆλ‹€
  • μ΄λ ‡κ²Œ ν•˜λ©΄ μ„œλ²„ μž¬μ‹œμž‘ μ‹œμ—λ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜κ³ , 둜그 관리도 νŽΈλ¦¬ν•©λ‹ˆλ‹€

λͺ¨λ‹ˆν„°λ§ 및 둜그 관리:

  • 배포 ν™˜κ²½μ—μ„œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€
  • systemd의 journalctl을 μ‚¬μš©ν•˜μ—¬ 둜그λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€
  • 예: journalctl -u your-service-name -f (μ‹€μ‹œκ°„ 둜그 확인)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] Week10 Mission

3 participants