카테고리 없음

[유레카 / 백엔드] TIL - 10 (Agile)

coding-quokka101 2025. 11. 12. 16:27

 애자일(Agile) 방법론


📌 들어가며

안녕하세요! 멀티캠퍼스 유레카 3기 백엔드 과정을 수강 중인 개발자 지망생입니다.

오늘은 코딩이 아닌 소프트웨어 개발 방법론을 배웠어요. 처음엔 "방법론이 뭐 그리 중요해? 그냥 코드 짜면 되는 거 아냐?"라고 생각했는데, 수업을 듣고 나니 완전히 생각이 바뀌었습니다.

특히 선배 개발자분이 이런 말씀을 하셨어요.

"실무에서는 애자일(Agile) 방법론을 많이 쓰는데, 이걸 모르면 팀 협업이 정말 힘들어. 취업 전에 공부해두면 큰 도움 될 거야!"

그래서 오늘은 애자일 방법론이 무엇인지, 왜 실무에서 중요한지, 그리고 개발자의 코드와 어떤 연관이 있는지 깊이 공부해봤습니다! 😊


🎯 Today I Learned

✅ 소프트웨어 개발 방법론이란?
✅ 폭포수(Waterfall) 모델의 특징과 한계
✅ 애자일(Agile) 방법론의 핵심 철학
✅ 스크럼(Scrum) 프레임워크 이해
✅ 애자일이 코드에 미치는 영향 (TDD, CI/CD)
✅ 칸반(Kanban) 보드와 실무 적용
✅ 애자일의 한계와 극복 방법

🤔 개발 방법론, 왜 필요할까?

방법론 없이 개발하면 생기는 문제들

개발을 시작하면 보통 이렇게 생각하죠.

 

출처: https://miro.medium.com/v2/resize:fit:1400/format:webp/0*gOUgYVG4QVdlw3p0

"요구사항 받았으니까 → 설계하고 → 코딩하고 → 테스트하면 끝!"

간단해 보이지만, 실제로는 이런 문제들이 발생해요:

개발 중간에 고객이 "이거 아닌데..." 라고 함

몇 달 개발했는데 시장 트렌드가 바뀜

마지막에 테스트했더니 처음부터 다시 만들어야 함

팀원들이 누가 뭘 하는지 몰라서 일이 겹침

마감 전날까지 아무것도 안 하다가 몰아서 함...

바로 이런 문제들을 해결하기 위해 개발 방법론이 필요한 거였어요!


📊 전통적인 폭포수(Waterfall) 모델

폭포수 모델이란?

물이 위에서 아래로 떨어지는 것처럼, 단계별로 순차적으로 진행하는 방식입니다.

1️⃣ 요구사항 분석 (2개월)
    ↓
2️⃣ 설계 (1개월)
    ↓
3️⃣ 구현 (3개월)
    ↓
4️⃣ 테스트 (1개월)
    ↓
5️⃣ 배포 및 유지보수

출처 : https://th.bing.com/th/id/OIP.OSjAy9B-prxJ5RF-lx6KDAHaC9?w=294&h=140&c=7&r=0&o=7&cb=ucfimgc2&dpr=1.8&pid=1.7&rm=3

 


폭포수 모델의 장단점

장점 단점

✅ 계획이 명확함 ❌ 변경이 매우 어려움
✅ 일정 관리가 쉬움 ❌ 고객이 결과물을 늦게 봄
✅ 문서화가 체계적 ❌ 리스크를 후반에 발견
✅ 이해하기 쉬움 ❌ 초기 요구사항 파악의 어려움

폭포수 모델의 치명적 문제

# 6개월 개발 후...
def show_result_to_client():
    client.review(final_product)
    
    if client.feedback == "이게 아닌데...":
        # 😱 처음부터 다시...
        redesign_everything()
        develop_again()  # 또 6개월...

실제로 이런 일이 자주 발생했고, 이를 해결하기 위해 애자일이 등장했습니다!


🚀 애자일(Agile) 방법론의 등장

애자일은 프로세스가 아니라 사고방식이다

2001년, 17명의 소프트웨어 개발자들이 모여서 만든 애자일 선언문:

📜 우리는 다음을 가치있게 여긴다:

✨ 프로세스와 도구보다 → 개인과 상호작용을
✨ 포괄적인 문서보다 → 작동하는 소프트웨어를
✨ 계약 협상보다 → 고객과의 협력을
✨ 계획을 따르기보다 → 변화에 대응하기를

출처 : https://moasoftware.co.kr/wp-content/uploads/2025/02/image-229.png

 

중요한 건, 애자일은 단순히 "짧게 개발하고 자주 배포하자"가 아니라는 거예요. 사람 중심의 사고 전환이 핵심입니다!

애자일의 핵심 개념

1. 반복적 개발 (Iterative Development)

# 폭포수 방식
def waterfall_development():
    plan_for_6_months()
    develop_for_6_months()
    release_once()  # 6개월 후 출시

# 애자일 방식
def agile_development():
    for week in range(1, 13):  # 2주마다
        plan_sprint()
        develop()
        get_feedback()  # 🔄 지속적 피드백
        adjust_direction()

장점: 매번 고객 피드백을 받아 개선할 수 있어요!

2. 점진적 개발 (Incremental Development)

// Sprint 1 (2주)
const mvp = {
    login: true,
    logout: true
    // 최소 기능만 구현
};
release(mvp);  // ✅ 동작하는 제품!

// Sprint 2 (2주)
const version2 = {
    ...mvp,
    createPost: true,
    viewPost: true
};
release(version2);  // ✅ 기능 추가!

// Sprint 3 (2주)
const version3 = {
    ...version2,
    comments: true,
    likes: true
};
release(version3);  // ✅ 계속 개선!

한 번에 완벽한 걸 만들려고 하지 않고, 조금씩 추가해나가요!


🏃 스크럼(Scrum) 프레임워크

애자일을 실제로 적용하는 방법 중 가장 유명한 게 **스크럼(Scrum)**이에요!

스크럼의 핵심 요소

1. 역할 (Roles)

🎯 Product Owner (제품 책임자)

  • 무엇을 만들지 결정
  • 우선순위 관리 (Product Backlog)
  • 고객과 소통

👥 Development Team (개발팀)

  • 실제 개발 담당
  • 자기 조직화된 팀
  • 5~9명 권장

🎪 Scrum Master (스크럼 마스터)

  • 스크럼 프로세스 지원
  • 장애물 제거
  • 팀 코칭

출처 : https://gitple.io/wp-content/uploads/2021/05/3-2-1536x1077.png

2. 스프린트 (Sprint)

📅 스프린트란?
   → 정해진 기간(보통 1~4주) 동안
   → 동작하는 제품 증분을 만드는
   → 짧은 개발 주기

보통 2주 단위로 진행하며, 각 스프린트마다 실제 동작 가능한 기능을 배포 가능한 형태로 완성합니다.

3. 스크럼 이벤트

① Sprint Planning (스프린트 계획)

  • 언제: 스프린트 시작할 때
  • 무엇: 이번 스프린트에 뭘 할지 결정
  • 시간: 2주 스프린트 기준 4시간

② Daily Scrum (데일리 스크럼)

  • 언제: 매일 같은 시간, 같은 장소
  • 무엇: 15분 동안 진행 상황 공유
  • 질문 3가지:
    1. 어제 뭘 했나?
    2. 오늘 뭘 할 건가?
    3. 어떤 장애물이 있나?

③ Sprint Review (스프린트 리뷰)

  • 언제: 스프린트 마지막
  • 무엇: 완성된 결과물 시연
  • 고객/이해관계자에게 피드백 받기

④ Sprint Retrospective (회고)

  • 언제: 스프린트 끝날 때
  • 무엇: 프로세스 개선점 찾기
  • 질문:
    • 잘한 점 (Keep)
    • 개선할 점 (Problem)
    • 시도할 것 (Try)

출처 : https://velog.velcdn.com/images/donghoim/post/62b281d4-d4fe-4c16-ba7e-f20e317d27b0/image.png


 

💻 애자일이 코드에 미치는 영향

1. TDD (Test-Driven Development)

애자일에서는 테스트를 먼저 작성해요!

// 1. 테스트 먼저 작성 (RED)
@Test
public void 회원가입_성공() {
    // given
    UserDto user = new UserDto("test@test.com", "1234");
    
    // when
    UserResultDto result = userService.register(user);
    
    // then
    assertEquals("success", result.getResult());
}

// 2. 테스트를 통과하는 최소한의 코드 작성 (GREEN)
public UserResultDto register(UserDto user) {
    if(userDao.insert(user) > 0) {
        return new UserResultDto("success");
    }
    return new UserResultDto("fail");
}

// 3. 리팩토링 (REFACTOR)

출처 : https://miro.medium.com/v2/resize:fit:1024/1*ehdOWtE5WhAqF1CZs9ioxg.png

 

2. CI/CD (지속적 통합/배포)

'빠른 피드백과 잦은 배포'를 실현하려면 기술적 기반이 필요해요!

# GitHub Actions 예시
# 코드를 푸시할 때마다 자동으로 테스트하고 배포!

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    # 자동 테스트
    - name: Run Tests
      run: mvn test
    
    # 테스트 통과하면 자동 배포
    - name: Deploy
      if: success()
      run: |
        ./deploy.sh

CI/CD의 장점:

  • CI (지속적 통합): 여러 개발자가 동시에 코드를 병합해도 문제 없도록 자동 빌드 및 테스트 수행
  • CD (지속적 배포): 검증된 코드를 스테이징 또는 운영 서버에 자동 배포

출처 : https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/05ac2cad-408e-433f-8150-0a2b71f63cfd/images/6fa3dbef-88de-4b3f-ae41-dfa90256a058.png

3. 작은 단위로 커밋하기

# ❌ 나쁜 예
git commit -m "기능 추가"

# ✅ 좋은 예 (애자일 방식)
git commit -m "feat: 사용자 로그인 API 구현"
git commit -m "test: 로그인 테스트 케이스 추가"
git commit -m "refactor: UserService 메서드 분리"
git commit -m "fix: 비밀번호 검증 버그 수정"

4. 리팩토링을 두려워하지 않기

// Sprint 1: 일단 동작하게 (Working Code)
public String login(String email, String pw) {
    User user = db.query("SELECT * FROM users WHERE email='" + email + "'");
    if(user != null && user.getPassword().equals(pw)) {
        return "success";
    }
    return "fail";
}

// Sprint 2: 리팩토링 (Clean Code)
public LoginResult login(LoginRequest request) {
    return userRepository.findByEmail(request.getEmail())
        .filter(user -> passwordEncoder.matches(
            request.getPassword(), 
            user.getPassword()
        ))
        .map(user -> LoginResult.success(user))
        .orElse(LoginResult.fail());
}

📋 칸반(Kanban)과 지속적 개선

칸반 보드란?

스크럼이 주기 중심의 방식이라면, **칸반(Kanban)**은 흐름 중심의 방식입니다.

┌──────────┬──────────┬──────────┬──────────┐
│  To Do   │  Doing   │  Review  │   Done   │
├──────────┼──────────┼──────────┼──────────┤
│ 회원가입  │ 로그인    │          │          │
│ 게시판    │          │          │          │
│ 댓글기능  │          │          │          │
└──────────┴──────────┴──────────┴──────────┘

 

칸반의 핵심

  • 작업의 흐름을 투명하게 공유
  • 병목 구간을 실시간으로 파악하고 개선
  • 지속적 개선(Kaizen)

실무에서 사용하는 도구

  • Jira: 전문적인 프로젝트 관리 도구
  • Trello: 간단하고 직관적
  • Notion: 문서 + 칸반보드 통합
  • GitHub Projects: 코드와 함께 관리

📊 폭포수 vs 애자일 완벽 비교

구분 폭포수 (Waterfall) 애자일 (Agile)

개발 주기 긴 주기 (수개월) 짧은 주기 (1~4주)
접근 방식 순차적, 선형적 반복적, 점진적
요구사항 초기에 고정 계속 변경 가능
고객 참여 초기 + 마지막 전 과정 지속적
결과물 마지막에 완제품 주기마다 동작하는 버전
문서화 매우 상세 필요한 만큼만
테스트 마지막에 지속적으로
위험 관리 후반에 발견 조기 발견 가능
변경 비용 매우 높음 낮음
적합한 프로젝트 요구사항 명확, 변경 없음 요구사항 불명확, 변경 많음

출처: https://www.designveloper.com/wp-content/uploads/2021/05/zproject-management.jpg

 


🌟 실무에서 애자일을 쓰는 이유

1. 빠른 시장 대응

// 2주마다 시장 반응 확인
for(let sprint = 1; sprint <= 10; sprint++) {
    const feature = develop();
    const feedback = releaseAndGetFeedback(feature);
    
    if(feedback.marketTrend === "changed") {
        adjustDirection();  // 방향 수정!
    }
}

// 폭포수라면?
// 6개월 개발 → 출시 → "이미 유행 지남..." 😭

2. 리스크 조기 발견

// Sprint 1에서 이미 발견!
@Test
public void 성능테스트() {
    long startTime = System.currentTimeMillis();
    userService.getUsers();
    long endTime = System.currentTimeMillis();
    
    assertTrue("응답시간 초과!", (endTime - startTime) < 1000);
    // ⚠️ 성능 문제 발견! → 바로 개선
}

3. 팀 생산성 향상

Daily Scrum 효과:

"나 어제 로그인 API 만들었는데, 
 비밀번호 암호화 어떻게 하셨어요?"

"아! 제가 BCrypt 라이브러리 썼는데, 
 코드 공유해드릴게요!"

→ 중복 작업 방지 ✅
→ 지식 공유 ✅
→ 빠른 문제 해결 ✅

⚡ 애자일의 한계와 극복

애자일은 완벽한 방법론이 아닙니다. 오히려 개발팀의 성숙도가 낮을수록 혼란을 초래할 수 있죠.

한계

명확한 문서화 부재

  • 인수인계나 유지보수 시 문제 발생

과도한 회의

  • 생산성 저하

우선순위 잦은 변경

  • 일정 예측 어려움

극복 방법

Jira / Confluence / Notion 등을 통한 명세 자동화

회의 시간 최소화, 비동기 커뮤니케이션 강화 (Slack, Notion 댓글)

CI/CD + 테스트 자동화로 품질 보증

결국 도구와 문화의 균형이 중요합니다!


💡 오늘 나는 무엇을 배웠는가

1. 애자일은 '빠른 개발'이 아니다

처음엔 "애자일 = 빨리빨리 개발"인 줄 알았는데, 전혀 아니었어요!

애자일의 진짜 의미 "변화에 유연하게 대응하면서, 고객에게 가치를 지속적으로 전달하는 것"

속도보다는 방향이 더 중요해요!

2. 완벽함보다 동작하는 것

폭포수 사고방식:
"완벽하게 설계하고, 완벽하게 개발하고, 완벽하게 테스트하자!"
→ 6개월 후 출시했는데 시장이 변함 😭

애자일 사고방식:
"일단 동작하는 최소 기능(MVP)을 2주 만에 만들자!"
→ 고객 피드백 받고 개선
→ 또 피드백 받고 개선
→ 시장 변화에 맞춰 방향 수정 ✅

이게 바로 "Done is better than perfect"!

3. 커뮤니케이션이 핵심

애자일에서 가장 중요한 건 사람과 소통이에요.

  • Daily Scrum으로 매일 소통
  • Sprint Review로 고객과 소통
  • Retrospective로 팀 내부 소통

문서보다는 대화, 계획보다는 실행과 피드백!

 


😊 좋았던 점 & 😅 아쉬웠던 점

좋았던 점

👍 실무 지향적인 수업

단순히 이론만 배운 게 아니라, CI/CD, TDD 같은 실무 기술과 연결해서 이해할 수 있었어요. 특히 선생님이 실제 회사에서 어떻게 스크럼을 운영하는지 경험담을 들려주셔서 생생했습니다!

👍 개발자의 사고방식 변화

"완벽하게 만들어야 해"에서 "일단 동작하게, 그 다음 개선하자"로 마인드가 바뀌었어요. 이게 훨씬 현실적이고 효율적이더라고요!

👍 애자일 철학에 공감

"계획을 따르기보다 변화에 대응하기를"이라는 문장이 계속 머릿속에 맴돌아요. 처음 짠 계획대로 안 되더라도, 유연하게 대응하면서 계속 앞으로 나아가는 것. 이게 애자일의 핵심이고, 개발자로서 가져야 할 마인드셋인 것 같아요.

아쉬웠던 점

😢 실습 시간 부족

이론 위주로 진행되다 보니 실제로 칸반보드를 만들어보거나 Jira를 직접 만져보는 시간이 부족했어요.

😢 대규모 프로젝트 적용 사례

4~5명 소규모 팀은 이해가 되는데, 실제 회사에서 수백 명이 일할 때는 어떻게 애자일을 적용하는지 궁금해요.

😢 실전 경험 부족

이론으로만 배워서 실제로 스크럼을 돌려본 경험은 없어요. 개인 프로젝트나 다음 협업 프로젝트에서 한번 적용해봐야겠습니다!


🎓 학습 팁

1. 애자일은 '실천'으로 배운다

책이나 강의로만 배우면 이해가 잘 안 돼요. 직접 해봐야 합니다!

개인 프로젝트 실천 계획:

  • ✅ 2주 단위 스프린트로 목표 설정
  • ✅ GitHub Projects로 칸반보드 만들기
  • ✅ 매주 일요일 회고 노트 작성
  • ✅ 커밋 메시지 규칙 지키기

2. 완벽한 계획보다 작은 실행

❌ 나쁜 예:
"칸반보드를 완벽하게 설계하고,
 규칙을 완벽하게 정하고,
 역할을 완벽하게 분담하고...
 → 결국 시작도 못 함

✅ 좋은 예:
"일단 Notion에 To Do, Doing, Done 컬럼 만들고,
 내일부터 해보면서 필요한 거 추가하자!"
 → 실행하면서 개선

3. 용어에 겁먹지 말기

스크럼, 스프린트, 백로그, 번다운 차트... 용어가 어려워 보이지만 사실 당연한 이야기들이에요.

  • Sprint = 짧은 개발 기간
  • Daily Scrum = 매일 모여서 얘기하기
  • Backlog = 해야 할 일 목록
  • Retrospective = 회고

우리말로 바꿔서 이해하면 쉬워요!

4. GitHub Projects로 혼자서도 애자일

나만의 2주 스프린트:
✅ Week 1-2: 로그인/회원가입만 완성
✅ Week 3-4: 게시판 CRUD 추가
✅ Week 5-6: 댓글 기능 추가

매주 일요일: 회고 노트 작성
- 잘한 점
- 개선할 점
- 다음 주 목표

🚀 다음 학습 목표

📌 단기 목표 (이번 주)
   ✓ 스크럼 관련 책 1권 읽기 (추천: "스크럼" by Jeff Sutherland)
   ✓ GitHub Projects로 개인 프로젝트 칸반보드 만들기
   ✓ TDD로 간단한 기능 구현해보기

📌 중기 목표 (이번 달)
   ✓ Jira, Trello 같은 도구 써보기
   ✓ CI/CD 파이프라인 직접 구축해보기
   ✓ 개인 프로젝트를 2주 스프린트로 진행

📌 장기 목표 (부트캠프 기간)
   ✓ 애자일 방식으로 프로젝트 경험 쌓기
   ✓ 회고(Retrospective) 문화 습관화
   ✓ 포트폴리오에 "애자일 프로젝트 경험" 강조

🎬 마치며

오늘 수업을 듣기 전에는 "개발 방법론? 그냥 코드 잘 짜면 되는 거 아냐?"라고 생각했어요.

하지만 수업을 듣고 나니, 어떻게 일할 것인가무엇을 만들 것인가만큼이나 중요하다는 걸 깨달았습니다.

"계획을 따르기보다 변화에 대응하기를"

특히 소프트웨어 개발에서는 빠르게 변하는 시장에 대응하는 게 생존의 열쇠예요. 애자일은 단순한 개발 방법론이 아니라, 유연하게 사고하는 마인드셋이라는 걸 배웠습니다.

"단순히 '유연한 개발 방식'으로만 이해했던 애자일을, CI/CD와 코드 리뷰, 협업 문화까지 아우르는 하나의 시스템으로 바라볼 수 있었다."

앞으로 개인 프로젝트를 할 때도 2주 단위 스프린트로 쪼개서 진행해봐야겠어요. 완벽한 계획보다 작은 실행이 더 중요하니까요! 💪

좋은 프로세스는 존재하지만, "그 프로세스를 따르는 개발자의 습관"이 더 중요하다는 사실을 잊지 말아야겠습니다.

여러분도 애자일 방법론, 한번 공부해보세요. 분명 개발자로서 한 단계 성장하는 계기가 될 거예요! 🚀