... ... naver-site-verification: naverd21459b1793ec2055e9baafcaf8d6b79.html AI와 함께하는 개발, 이것만은 주의하세요 :: 전다세

전다세

생활정보, 금융정보,일상생활블로그입니다.

  • 2025. 8. 19.

    by. 전다세

    목차

      반응형

      AI와 함께하는 개발, 이것만은 주의하세요

      안녕하세요! AI 코딩 도구들이 정말 편리하죠? 저도 매일 사용하면서 개발 속도가 몇 배는 빨라진 것 같아요. 하지만 몇 개월 사용하면서 "앗, 이건 조심해야겠다" 싶은 순간들이 꽤 있었어요.

      오늘은 AI 코딩의 달콤한 장점만 말하는 게 아니라, 실제로 겪은 함정들과 주의점을 솔직하게 이야기해보려고 해요. 미리 알고 계시면 같은 실수 안 하실 거예요! 

       

      AI 코드를 맹신하면 안 되는 이유 

      실제 경험담: "완벽해 보였는데..."

      상황: JWT 토큰 검증 로직을 AI가 생성해줬는데, 테스트해보니 완벽하게 작동했어요.

      AI가 생성한 코드:

      function verifyToken(token) {
          try {
              const decoded = jwt.verify(token, process.env.JWT_SECRET);
              return { success: true, data: decoded };
          } catch (error) {
              return { success: false, error: error.message };
          }
      }

      문제점: 언뜻 보면 완벽해 보이죠? 하지만 실제 보안 검토를 해보니...

      1. 토큰 만료 시간 검증 누락
      2. 토큰 타입(Bearer) 검증 없음
      3. 블랙리스트 토큰 체크 없음
      4. 에러 메시지가 너무 상세함 (보안상 위험)

      교훈: AI는 "일반적으로 작동하는" 코드는 잘 만들지만, 보안이나 엣지 케이스는 놓치기 쉬워요.

       

       실제 경험담 2: "성능 문제 발견"

      상황: 사용자 목록을 가져오는 API를 AI가 만들어줬어요.

      // AI가 생성한 코드
      async function getUsers() {
          const users = await User.findAll();
          const usersWithPosts = [];
      
          for (let user of users) {
              const posts = await Post.findAll({ where: { userId: user.id } });
              usersWithPosts.push({ ...user.dataValues, posts });
          }
      
          return usersWithPosts;
      }

      문제점: 사용자가 1000명이면 1001번의 DB 쿼리! 전형적인 N+1 쿼리 문제였어요.

      개선된 코드:

      async function getUsers() {
          return await User.findAll({
              include: [{ model: Post }]
          });
      }

      교훈: AI는 기능적으로는 맞지만 성능 최적화는 고려하지 않을 수 있어요.

      코드 리뷰의 중요성 

      AI 코드 리뷰 체크리스트

      AI가 생성한 코드를 받으면 반드시 이런 것들을 체크하세요:

      ✅ 기능적 검토

      • 요구사항을 정확히 만족하는가?
      • 엣지 케이스 처리가 되어 있는가?
      • 에러 핸들링이 적절한가?

      ✅ 보안 검토

      • 입력값 검증이 되어 있는가?
      • SQL 인젝션 등 보안 취약점은 없는가?
      • 민감한 정보가 로그에 노출되지 않는가?
      • 권한 검증이 적절한가?

      ✅ 성능 검토

      • 불필요한 반복문이나 중복 로직은 없는가?
      • 데이터베이스 쿼리가 최적화되어 있는가?
      • 메모리 누수 가능성은 없는가?

      ✅ 유지보수성 검토

      • 코드가 이해하기 쉬운가?
      • 변수명과 함수명이 명확한가?
      • 주석이 필요한 부분에 적절히 작성되어 있는가?

      실전 리뷰 예시

      AI 생성 코드:

      def calculate_discount(price, user_type):
          if user_type == "premium":
              return price * 0.8
          elif user_type == "regular":
              return price * 0.9
          else:
              return price

      리뷰 결과:
      문제점들:

      • user_type 검증 없음 (None 값 들어오면?)
      • price 음수 체크 없음
      • 할인률이 하드코딩됨 (설정으로 분리 필요)
      • 반환값이 float라서 정확도 문제 가능

      개선된 코드:

      from decimal import Decimal
      from typing import Union
      
      DISCOUNT_RATES = {
          "premium": Decimal("0.20"),  # 20% 할인
          "regular": Decimal("0.10"),  # 10% 할인
      }
      
      def calculate_discount(price: Union[int, float, Decimal], user_type: str) -> Decimal:
          """사용자 유형에 따른 할인 가격 계산"""
          if not isinstance(price, (int, float, Decimal)):
              raise TypeError("Price must be a number")
      
          if price < 0:
              raise ValueError("Price cannot be negative")
      
          if not isinstance(user_type, str):
              raise TypeError("User type must be a string")
      
          price_decimal = Decimal(str(price))
          discount_rate = DISCOUNT_RATES.get(user_type.lower(), Decimal("0"))
      
          return price_decimal * (Decimal("1") - discount_rate)

      보안 이슈 체크 포인트 

      위험한 AI 코드 패턴들

      1. 입력값 검증 누락

      // ❌ 위험한 코드 (AI가 자주 생성)
      app.post('/user/:id', (req, res) => {
          const userId = req.params.id;
          const query = `SELECT * FROM users WHERE id = ${userId}`;
          // SQL 인젝션 위험!
      });
      
      // ✅ 안전한 코드
      app.post('/user/:id', (req, res) => {
          const userId = parseInt(req.params.id);
          if (isNaN(userId) || userId <= 0) {
              return res.status(400).json({ error: 'Invalid user ID' });
          }
          const query = `SELECT * FROM users WHERE id = ?`;
          // 파라미터화된 쿼리 사용
      });

      2. 민감 정보 노출

      // ❌ 위험한 코드
      app.post('/login', async (req, res) => {
          try {
              const user = await authenticateUser(req.body);
              res.json({ success: true, user: user }); // 비밀번호 해시까지 노출!
          } catch (error) {
              res.json({ success: false, error: error.message }); // 상세한 에러 노출!
          }
      });
      
      // ✅ 안전한 코드
      app.post('/login', async (req, res) => {
          try {
              const user = await authenticateUser(req.body);
              const { password, ...safeUser } = user;
              res.json({ success: true, user: safeUser });
          } catch (error) {
              res.status(401).json({ success: false, error: 'Authentication failed' });
          }
      });

      보안 검토 도구 활용

      AI 코드를 받은 후 이런 도구들로 추가 검토하세요:

      # ESLint 보안 플러그인
      npm install eslint-plugin-security
      
      # 의존성 취약점 검사
      npm audit
      
      # 코드 품질 검사
      sonarqube-scanner

      실력 향상과 AI 활용의 균형 

      위험 신호들

       

      이런 상황이라면 AI 의존도를 줄여야 해요:

      1. AI 없이는 간단한 코드도 못 짜겠다
      2. AI가 생성한 코드의 동작 원리를 모르겠다
      3. 디버깅할 때 AI에게만 의존한다
      4. 새로운 기술을 배우려 하지 않는다

      건강한 AI 활용법

      📚 학습 우선 원칙

      1. 새로운 개념은 직접 학습 후 AI 활용
      2. AI 코드를 받으면 반드시 분석하고 이해
      3. 핵심 로직은 직접 작성, 보조적 부분만 AI 활용
      4. 정기적으로 AI 없이 코딩하는 시간 가지기

       

       AI 활용 가이드라인

      ✅ AI에게 맡겨도 좋은 것들:

      • 보일러플레이트 코드
      • 반복적인 CRUD 로직
      • 테스트 코드 초안
      • 문서화 작업
      • 간단한 유틸리티 함수

      ⚠️ 직접 해야 하는 것들:

      • 핵심 비즈니스 로직
      • 복잡한 알고리즘
      • 아키텍처 설계
      • 성능 최적화
      • 보안 구현

      실력 향상을 위한 실천 방법

       30일 챌린지

      주 1일: AI 없는 코딩 데이
      - 작은 프로젝트를 AI 도움 없이 구현
      - 막히는 부분은 공식 문서나 교재 활용
      - 완성 후 AI 버전과 비교 분석

      🔍 코드 분석 습관

      AI 코드를 받으면:
      1. 한 줄씩 읽으며 동작 이해하기
      2. 다른 방법으로도 구현해보기
      3. 성능이나 보안 관점에서 검토하기
      4. 개선점 찾아보기

      팀 개발에서의 AI 사용 규칙 

      팀 컨벤션 예시

      ## AI 코딩 가이드라인
      
      ### 허용되는 AI 사용
      - 보일러플레이트 코드 생성
      - 테스트 코드 작성 지원
      - 코드 리뷰 보조
      - 문서화 작업
      
      ### 필수 검토 사항
      - AI 생성 코드는 반드시 PR에 명시
      - 보안 관련 코드는 시니어 개발자 리뷰 필수
      - 성능 테스트 결과 첨부
      - 코드 동작 원리 설명 코멘트 필수
      
      ### 금지 사항
      - 핵심 비즈니스 로직을 AI에만 의존
      - AI 코드를 검토 없이 바로 배포
      - 라이선스나 저작권 확인 없이 사용

      실제 사고 사례와 교훈 

      사례 1: 라이브러리 버전 혼동

      상황: AI가 오래된 React 문법으로 코드를 생성

      // AI가 생성한 구버전 코드
      componentDidMount() {
          // 이미 deprecated된 방식
      }

      문제: 최신 프로젝트에서 경고 발생, 성능 이슈

      교훈: AI는 최신 베스트 프랙티스를 반영하지 못할 수 있어요.

       

      사례 2: 라이선스 문제

      상황: AI가 GPL 라이선스 코드와 유사한 로직 생성

      문제: 상용 제품에 사용할 수 없는 라이선스

      교훈: AI 생성 코드도 저작권이나 라이선스 검토가 필요해요.

       

      사례 3: 플랫폼별 차이 무시

      상황: Node.js용 코드를 요청했는데 브라우저용 API 사용

      문제: 실제 환경에서 작동하지 않음

      교훈: 구체적인 환경과 제약사항을 명시해야 해요.

      마무리: 똑똑한 AI 활용법 

      AI는 정말 강력한 도구지만, 도구는 도구일 뿐이에요. 중요한 건 우리가 어떻게 활용하느냐죠.

       

       핵심 원칙

      1. AI는 파트너, 대체재가 아니다
      2. 생성된 코드는 반드시 검토한다
      3. 보안과 성능은 더욱 꼼꼼히 체크한다
      4. 실력 향상을 게을리하지 않는다
      5. 팀 규칙을 정하고 지킨다

      AI와 함께하는 개발이 더 안전하고 효율적이 되길 바라요! 다음번엔 혼자 개발할 때 생산성을 10배 높이는 구체적인 방법들을 공유해드릴게요.

      여러분도 AI 사용하면서 겪은 실수나 주의점이 있다면 댓글로 공유해주세요. 함께 배워가요! 

       


      안전하고 효율적인 AI 코딩을 위해 항상 주의깊게 접근하세요.

      반응형

    /* 볼드 형광펜 */ .tt_article_useless_p_margin.contents_style > p > b{ padding: 2px 5px!important; border-radius: 4px!important; font-weight: bold; background-color: rgba(1, 193, 91, 0.12)!important;