요즘 생성형 AI를 쓰는 사람이 많아지면서 "ChatGPT vs Claude vs Gemini 비교", "GPT Claude Gemini 차이" 같은 검색도 정말 많이 보인다. 셋 다 질문하면 답해주고, 글도 써주고, 코드도 도와주니까 얼핏 보면 비슷해 보이기 때문이다.

나도 처음에는 그냥 “회사만 다른 거 아닌가?” 싶었다. 그런데 실제로 계속 써보면 차이가 꽤 분명하다. 단순히 취향 문제가 아니라, 어떤 작업에서 더 잘 맞는지가 다르다. 이번 글에서는 ChatGPT, Claude, Gemini의 차이점을 너무 어렵지 않게 정리해보려고 한다.

ChatGPT, Claude, Gemini 차이점부터 간단히 정리

먼저 한 줄로 정리하면, 셋은 다 같은 AI가 아니라 성격과 강점이 다른 도구다.

먼저 큰 틀부터 보면,

  • GPT는 OpenAI의 모델이고, 가장 대중적으로 많이 알려져 있다.
  • Claude는 Anthropic의 모델이고, 긴 문맥 처리와 비교적 차분한 응답 스타일로 많이 언급된다.
  • Gemini는 Google의 모델이고, 검색·워크스페이스 생태계와의 연결성이 강점으로 자주 이야기된다.

여기서 중요한 건 셋 다 그냥 “똑같은 챗봇”이 아니라는 점이다. 학습 방식, 제품 설계 방향, 안전 정책, 연결된 기능이 다르기 때문에 결과적으로 사용감도 달라진다. 사용자는 보통 내부 구조를 다 알 필요는 없지만, 왜 체감이 다른지 정도는 알고 있으면 훨씬 잘 골라 쓸 수 있다.

 


ChatGPT 장점과 단점 — 왜 가장 무난한 AI로 느껴질까?

ChatGPT는 처음 써보는 사람도 바로 적응하기 쉬운 올라운더형 AI다.

GPT를 쓰면 제일 먼저 느끼는 건 반응이 빠르고, 여러 종류의 작업을 무난하게 처리한다는 점이다. 아이디어 브레인스토밍, 문장 다듬기, 간단한 코드 작성, 표 정리, 이미지 관련 작업까지 전반적으로 “두루두루 잘하는” 느낌이 있다.

그래서 처음 AI를 써보는 사람에게 가장 추천하기 쉬운 편이다. "일단 하나만 써보라면 뭐가 좋아?"라고 물으면 GPT를 많이 떠올리게 되는 이유도 여기에 있다.

다만 단점도 있다. GPT는 종종 자신감 있게 틀린 말을 한다. 이게 무서운 이유는, 얼핏 보면 말이 너무 그럴듯해서 틀린 걸 바로 알아차리기 어렵다는 점이다. 특히 정확한 출처가 필요한 정보, 법/의학/최신 이슈처럼 검증이 중요한 분야에서는 그대로 믿으면 위험할 수 있다. 또한 개인적으로는 GPT특유의 그 AI정석 같은 말투가 사람을 열받게 할 때가 있다고 느낀다...... 

ChatGPT를 쓰면 좋은 경우

  • 빠르게 초안 만들기
  • 아이디어 여러 개 뽑기
  • 문장 표현 다듬기
  • 이것저것 시켜보며 방향 잡기

아쉬운 점

  • 틀린 내용을 그럴듯하게 말할 때가 있음
  • 검증이 필요한 정보는 꼭 다시 확인해야 함

 


Claude 장점과 단점 — 긴 글 요약과 코드 작업에 강한 이유

Claude는 긴 맥락을 붙잡고 정리하는 작업에서 강점이 느껴지는 편이다.

Claude는 써보면 답변 톤이 조금 더 차분하고, 무리해서 아는 척하지 않는 쪽으로 느껴질 때가 많다. 물론 이것도 모델 버전이나 상황에 따라 다르지만, 전체적으로는 “조금 더 신중한 조수” 같은 인상이 있다.

특히 긴 문서를 넣고 요약하거나, 앞에서 했던 대화를 이어서 정리할 때 체감이 괜찮다. 코드 작업에서도 한두 줄보다 여러 파일 맥락을 이어 보는 작업에서 편하게 느껴지는 경우가 있었다. 예를 들어 리팩터링 방향을 잡거나, 이미 작성된 코드의 구조를 설명하게 할 때 비교적 안정감이 있었다.

물론 Claude도 완벽하지는 않다. 너무 조심스럽게 답해서 답답하게 느껴질 때도 있고, 반대로 원하는 형식으로 딱 떨어지게 만들려면 프롬프트를 더 세밀하게 줘야 할 때도 있다. 하지만 긴 호흡의 작업에서는 꽤 강점이 있다.

Claude를 쓰면 좋은 경우

  • 긴 글 요약 및 정리
  • 문서 구조화
  • 긴 코드 맥락 이해
  • 신중한 초안 검토

아쉬운 점

  • 응답이 조금 조심스러워 답답하게 느껴질 수 있음
  • 원하는 포맷을 만들려면 더 구체적인 지시가 필요할 때가 있음

 


Gemini 장점과 단점 — 최신 정보 검색과 구글 연동에 강한 이유

Gemini는 최신 정보와 구글 생태계 연결이 중요한 사람에게 특히 잘 맞는다.

Gemini의 가장 큰 차별점은 Google과의 연결성이다. 검색 기반 정보 접근이나 Gmail, Docs, Drive 같은 서비스와 엮이는 경험이 상대적으로 자연스럽다. 그래서 “지금 기준으로 어떤 이슈가 있지?” 같은 질문이나, 구글 서비스와 함께 쓰는 흐름에서는 장점이 분명하다.

이건 생각보다 꽤 중요하다. GPT나 Claude가 잘하는 건 많지만, 최신성이 중요한 작업은 별도 검색이나 검증이 거의 필수다. 반면 Gemini는 애초에 구글 생태계 안에서 움직이는 경험이 강해서, 실사용에서는 "검색형 비서"처럼 느껴질 때가 있다.

대신 모든 작업에서 제일 좋다고 말하기는 어렵다. 어떤 사람에게는 응답 스타일이 덜 자연스럽게 느껴질 수도 있고, 글쓰기나 창의적인 구성에서는 다른 모델을 더 선호할 수도 있다. 결국 Gemini는 “최신 정보 + 구글 연결”이라는 축에서 더 매력적인 모델이라고 보는 편이 맞다.

Gemini를 쓰면 좋은 경우

  • 최신 정보 확인
  • 검색 기반 정리
  • Gmail / Docs / Drive와 연계된 흐름
  • 구글 서비스 중심 작업

아쉬운 점

  • 모든 작업에서 무조건 최고라고 보긴 어려움
  • 글쓰기 취향은 사람마다 호불호가 갈릴 수 있음

 


ChatGPT, Claude, Gemini 중 어떤 AI를 선택하면 좋을까?

여기서 중요한 건 누가 더 똑똑한지가 아니라, 지금 하는 작업에 누가 더 잘 맞는지다.

실제 사용에서는 작업 종류에 따라 잘 맞는 모델이 달라진다.

예를 들어,

  • 아이디어를 빨리 뽑고 초안을 만들고 싶다 → GPT
  • 긴 글이나 긴 코드 문맥을 안정적으로 다루고 싶다 → Claude
  • 최신 정보나 구글 서비스 연동이 중요하다 → Gemini

이렇게 보면 된다.

그리고 한 가지 더 중요한 점은, AI를 잘 쓰는 사람들은 보통 하나만 고집하지 않는다는 것이다. 초안은 GPT로 잡고, 긴 문서 정리는 Claude로 하고, 최신 정보 확인은 Gemini로 하는 식으로 역할을 나눠 쓰는 경우가 꽤 많다. 결국 핵심은 "어떤 모델이 최고냐"보다 "지금 내 작업에 뭐가 맞냐"에 더 가깝다.

선택 기준 요약

  • 빠른 초안과 아이디어 → ChatGPT
  • 긴 문맥과 정리 작업 → Claude
  • 최신 정보와 구글 연동 → Gemini

직접 써보니 느껴진 ChatGPT, Claude, Gemini의 핵심 차이

직접 비교해보면 성능표보다 ‘답변 성격’ 차이가 더 크게 느껴진다.

개인적으로는 성능 수치보다도 성격 차이가 더 크게 느껴졌다.

GPT는 빠릿하고, Claude는 신중하고, Gemini는 연결성이 좋다. 물론 이 표현이 완벽하게 정확한 기술 설명은 아니다. 하지만 실제 사용자 입장에서는 이런 식의 체감 설명이 오히려 더 도움이 된다. 대부분의 사람은 논문 스펙보다 “그래서 내가 뭘 쓸 때 좋은데?”가 더 중요하기 때문이다.

그리고 AI를 처음 쓰는 사람일수록 한 모델만 써보고 전체를 판단하기 쉽다. 그런데 조금만 비교해서 써보면, 같은 질문에도 답변 스타일과 강점이 꽤 다르다는 걸 금방 느끼게 된다. 그래서 가능하면 셋 다 가볍게라도 써보는 걸 추천한다. 직접 써보는 게 제일 빨리 감이 온다.

핵심 체감 요약

  • GPT → 빠르고 다재다능함
  • Claude → 차분하고 긴 맥락 처리에 강함
  • Gemini → 최신 정보와 서비스 연결에 유리함

결론 — ChatGPT, Claude, Gemini 비교에서 중요한 건 "누가 최고냐"보다 용도다

결론은 단순하다. 하나를 정답처럼 고르기보다, 상황에 따라 나눠 쓰는 쪽이 훨씬 실용적이다.

GPT, Claude, Gemini는 다 비슷해 보이지만 실제로는 꽤 다르다. 차이는 단순히 회사 이름이 아니라, 어떤 작업에서 더 편한지, 어떤 방식으로 답하는지, 무엇과 연결되는지에서 드러난다.

하나만 정답처럼 고르기보다는, 각 모델의 성격을 알고 상황에 맞게 쓰는 편이 훨씬 실용적이다. 나도 써볼수록 "이 질문은 얘한테", "이 정리는 저쪽이 더 낫네" 같은 감각이 조금씩 생기고 있다. 특히 OpenClaw처럼 여러 모델을 API로 연결해서 쓸 수 있는 환경에서는, 나한테 잘 맞는 모델을 찾아서 상황에 맞게 사용하는 것이 더 중요해진다고 느꼈다.

 

✨Model Context Protocol란?

사람의 질의를 이해해서 외부 API 등과 연계할 수 있도록 하는 공통 인터페이스. Agent와 tool 이 통신할 때 각각의 sdk를 만들 필요 없이 프로토콜 스펙만 맞추면 되게 만들어진 중간 다리 역할. 기존에는 API마다 코드를 작성했어야 하나 MCP를 사용하게 되면서 공통 포맷으로 통일이 되어 사용에 용이하다.

MCP 구성 요소

  • LLM application: 사용자와 직접 상호작용하는 챗봇 인터페이스. 내부에 LLM과 MCP client를 포함.
    • [MCP Client]
      • LLM의 도구 호출 제안을 MCP 프로토콜에 맞게 변환하여 MCP Server로 전송.
      • MCP 서버로부터 도구 실행 결과를 수신하여 LLM에 전달
      • LLM과 MCP Server 간의 통신 채널 관리
    • [MCP Server]
      • 외부 도구와 서비스에 대한 접근을 관리하는 중앙 허브
      • 툴 을 저장하고, 호출 요청을 수신하여 형식을 가공하는 등의 역할 수행
    • [Tools]
      • MCP Server를 통해 접근되는 외부 시스템.
      • API, DB, 파일시스템 

MCP 프로토콜 동작 흐름

  1. 사용자 질의 입력
  2. 질의 분석
    사용자의 질의 의도를 파악하고 구조화 한다. 정보 타입을 확인하고, 해당 질의가 내부 지식으로 답변 가능한지 파악한다.
  3. 처리 전략 선택
    2의 질의 분석을 토대로 tool을 사용할 것인지 스스로 답변할 것인지를 결정한다.
  4. 툴 체인 구성
    툴 호출 명세를 작성한다. 미리 정해진 json의 형태로 전달한다.
  5. 툴 실행
    전달받은 json을 토대로 api를 호출하여 답변에 필요한 자료들을 가져온다.
  6. 답변 생성
    5에서 얻어온 정보를 활용하여 사용자가 이해할 수 있도록 답변을 전달한다.

✨MCP 프로토콜 구현 방법

  • 도구 정의
    • LLM이 사용할 수 있는 외부 도구를 LLM이 이해할 수 있는 형태로 정의
    • 도구 이름, 설명, 입력 파라미터 등을 정의한다
    • 예시
{
  "name": "get_current_weather",
  "description": "현재 특정 도시의 날씨 정보를 가져옵니다.",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "날씨를 알고 싶은 도시 이름 (예: 서울, 뉴욕)"
      },
      "unit": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"],
        "description": "온도 단위 (섭씨 또는 화씨)",
        "default": "celsius"
      }
    },
    "required": ["location"]
  }
}
  • LLM과 도구 연동
    • LLM이 언제 어떻게 도구를 사용할 지 결정
    • 처음 LLM에게 사용자 질의와 함께 1단계에서 정의한 도구 목록을 함께 전달. 이를 참조하여 사용자 질의에 적합한 도구를 선택하거나, 도구 호출 파라미터를 생성 및 Function call 작성
    • 예시
{
  "tool_calls": [
    {
      "id": "call_12345",
      "type": "function",
      "function": {
        "name": "get_current_weather",
        "arguments": "{\"location\": \"서울\", \"unit\": \"celsius\"}"
      }
    }
  ]
}

 

  • Function call의 리턴값인 JSON 분석 후 실제 자연어 답변 생성
  • MCP  서버/ 클라이언트 통신
    • 통신 프로토콜 선택: gRPC, REST API, 웹 소켓 등
    • mcp 클라이언트 구현: MCP Server와 연결 관리, 요청 직렬화, 응답 역직렬화, 비동기 처리
    • mcp 서버 구현: 요청 파싱, 결과 반환 및 에러처리, 보안 관련 작업들

✨날씨 Tool 사용 예시 GITHUB

spring-ai-examples/model-context-protocol/weather/starter-webflux-server at main · spring-projects/spring-ai-examples · GitHub

안녕하세요 공백입니다._.
벌써 올해의 절반이 지나 6월이 되었네요 시간이 참 빠른 것 같습니다.. 저는 25년 상반기 대학원 입시에서 서강대학교 aisw 대학원에 합격하여 1학기를 보냈습니다. (https://bl-nk.tistory.com/120) 대학원에서 만난 원우들과 즐거운 시간도 많이 보내고, 수업도 열심히 들으면서 바쁘게 나날을 보냈습니다. 다행히 저희 회사는 유연근무가 가능했고, 회사와 학교가 그리 멀지 않은 곳에 있어서 등하교가 물리적으로 어렵지는 않았지만... 퇴근하고 수업들으러 가는 자체가 많은 체력을 요하더군요ㅜㅠ 그래도 다행히 서강대학교는 중간고사 이후로는 교수님들의 재량으로 온라인 수업이 가능하여서 체력적으로 편하게 다니고 있습니다. 물론 수업은 직접 현장에서 듣는 게 더 집중이 잘 되는 것 같긴하지만요..!

사설이 길었습니다. 아무튼 이미 재학중인 제가 다시 합격 수기를 적는다는 것은.. 새롭게 입학한다는 뜻이겠지요! 결론부터 말씀드리자면 저는 이번 후기 입시에서 [연세대학교 인공지능융합대학원]과 [고려대학고 SWAI 융합대학원]에 합격하였습니다! 

서류전형

고려대학고 SWAI 융합대학원은 4월 1일부터 10일까지 원서 접수를 받았습니다. 서류를 직접 뽑아서 시한 내에 제출해야 하기 때문에 미리미리 준비하셔서 미리 접수하시기를 추천드립니다! 25년 후기의 경우 원서 접수 다음날 17시까지 서류접수를 받았습니다.

연세대학교의 원서접수는 4월 14일부터 23일까지였습니다. 연대는 온라인으로 서류를 제출하기 때문에 따로 우체국을 찾아가지 않고도 지원을 완료할 수 있었습니다. 지난 글에서 말씀드렸듯이 연세대학교는 서류 전형과 면접 전형이 분리되어 있습니다. 따라서 서류 전형에 합격한 사람만이 면접을 볼 수 있는 기회를 얻을 수 있습니다. 연대의 1차 결과는 5월 9일에 발표되었습니다.

면접전형

두 학교 모두 면접 시 필수로 수험표신분증을 챙겨가야 합니다. 면접 대기장소에서는 전자기기를 사용하지 못하니 꼭 종이로 된 노트와 참고 자료를 챙겨가시길 추천드립니다! 면접 복장으로는 무난하게 정장을 입고 가시면 될 것 같습니다. 남성분들의 경우 타이까지 한 정장을 입으신 분들이 많았고, 여성분들은 트위드 자켓 등 비즈니스 캐쥬얼 느낌으로 입으신 분들도 많았습니다.
고려대학교의 면접은 5월 10일이었습니다. 여러 개의 대기실에 응시인원이 대기하다가 타임별로 3~5명이 입장하는 형식이었습니다. 동일한 시간에 여러 면접장에서 면접이 진행되는 것으로 보였습니다. 저는 2분의 면접관님과 3명의 지원자들로 구성된 면접에 참여하였습니다. 면접은 10~15분 정도로 진행되었습니다. 간단한 자기소개를 시작으로 전공 관련 질문들을 물어보셨습니다. 개괄적인 질문을 하시고 더 구체적으로 대답할 수 있게 꼬리질문을 주시는 형태로 면접이 진행되었습니다. '인공지능 대학원 면접'을 검색하면 나오는 유튜브와 블로그들을 공부하고 갔는데, 나름 준비했던 질문들에서 잘 대답했다는 생각을 하고 면접장에서 퇴장하였습니다. 
연세대학교의 면접은 5월 17일이었습니다. 1차 발표가 9일에 났으니 1주일 가량의 준비 시간이 있었습니다. 공학대학이 정문 근처에 있어서 쉽게 찾을 수 있었습니다. 연대 면접은 면접장 1개에서 진행되었습니다. 1타임에 15분~20분 정도의 면접 시간으로 4명이 참여했습니다. 면접관 교수님들은 5분이 들어와 계셨습니다. 역시 질문은 한 사람당 2~3개정도 주셨습니다.

결과

앞에서 스포했듯이 감사하게도 두 학교 모두 합격 통지를 받을 수 있었습니다. 한 학기를 곧 수료할 시점에서 학교를 옮긴다는 것이 아깝기도 하고 여러 감정이 교차하긴 하네요.

고려대학교는 5학기, 연세대학교는 4학기 제로 운영되고, 등록금이나 여러 고려해야 할 부분들이 있어서 7월 초까지 조금 고민 해보고 등록할 예정입니다. 다시 시작하는 석사 1학기.. 고민이 많이 되긴 하지만 즐거운 대학원 생활이 되었으면 좋겠네요. 읽어주셔서 감사합니다:)

Google OAuth2 로그인 로직을 작성하던 중, google client와 관련된 값을 Git에 push하려고 하니 보안 사항을 올릴 수 없다는 에러를 받은 적이 있다....! Git에 민감한 정보는 올리지 말라나뭐라나.. 그래서 application.yml파일에 중요한 정보를 직접 넣지 않고, .env 파일을 작성해 값을 삽입하는 방법을 찾아보았다!

1. .env파일 작성

GOOGLE_CLIENT_ID=abcdefg  		//실제 application.yml의 ${GOOGLE_CLIENT_ID}에 넣고 싶은 값
GOOGLE_CLIENT_SECRET=abcdefg	//실제 application.yml의 ${GOOGLE_CLIENT_SECRET}에 넣고 싶은 값

2. application.yml 작성

spring:
//////////////////////////////////////////////////////
  config:
    import: optional:file:.env[.properties]
//////////////////////////////////////////////////////
  security:
    oauth2:
      client:
        registration:
          google:
//////////////////////////////////////////////////////
            client-id: ${GOOGLE_CLIENT_ID}
            client-secret: ${GOOGLE_CLIENT_SECRET}
//////////////////////////////////////////////////////

3. .gitignore에 .env 파일 추가

위의 단계를 거치면 git에는 나의 보안 정보를 올리지 않으면서, 프로젝트를 잘 실행시킬 수 있다!

'SPRING' 카테고리의 다른 글

[Spring Security] H2 DB연결 에러 해결 방법  (0) 2024.12.20

1. 구글 OAuth2 로그인을 위해 SecurityConfig를 작성했는데, h2페이지로 연결하려고 보니 문제가 생기는 것을 확인했다...! http의 authorizeHttpRequests에서 인증된 사이트에만 접근할 수 있도록 설정을 해두었기 때문에, 다른 contenxt-path를 적으면 default url로 넘어가게 된다. 이를 방지 하기 위해 requestMatchers에 `h2-console.**` 을 추가해주었다.

        http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/login.html", "/static/**", "/h2-console/**").permitAll()
                .anyRequest().authenticated()
            )

h2-console 페이지로 연결도 되고, test connection도 잘 되어서 문제 해결인 줄 알았는데! connect를 누르니 우울한 표정의 친구들이 나왔다...!

2. `localhost에서 연결을 거부했습니다` 라는 메시지는 브라우저에서 보안정책에 의해 H2 콘솔이 iframe으로 로드되지 못할 때 발생하는 경우가 많다고 한다. 아무튼 위의 문제를 해결하기 위해서 Frame Options와 Same-Origin Policy의 작동 방법을 알아보았다.

Frame Options는 웹 애플리케이션이 다른 사이트나 도메인에서 iframe으로 로드되지 않도록 설정할 수 있는 보안 헤더로 클릭재킹 공격을 방지할 수 있다. 스프링 시큐리티에서는 frame Options의 설정을 `DENY`,`SAMEORIGIN`,`ALLOW-FROM`으로 정의할 수 있다. H2 콘솔은 웹 브라우저에서 iframe 형태로 동작하는데 스프링 부트는 기본적으로 frameOptions의 기본값을 DENY로 설정하기 때문에 FrameOptions 정책을 위반하여 연결을 거부하게 되는 것이다. 구글링을 통해 headers().frameOptions().disable()을 추가하면 에러가 해결된다는 내용을 찾아서 넣었으나, 6.1부터 deprecated되었다는 에러 메시지를 발견하였다. 

3. 현재 애플리케이션이 실행되고 있는 도메인에서는 iframe을 허용할 수 있도록, 즉 frameOptions를 sameOrigin으로 설정해주는 방법으로 해결할 수 있었다.

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/login.html", "/static/**", "/h2-console/**").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                .loginPage("/login.html")
                .defaultSuccessUrl("/", true)
            )
            .headers(headers -> headers.frameOptions(FrameOptionsConfig::sameOrigin));
        return http.build();
    }

'SPRING' 카테고리의 다른 글

[Spring] .env 파일로 보안 컨텐츠 삽입  (1) 2024.12.20

안녕하세요 공백입니다._.
저는 현재 인공지능 서비스 회사의 프로젝트 수행팀에서 2년차 개발자로 재직중입니다. 프로젝트를 수행하면서 모델 학습과 관련된 부분에서 공부를 해보고 싶은 생각이 들어 대학원 진학을 결심하게 되었습니다. 회사랑 병행을 하기 위해 특수대학원(야간대학원)으로 정보를 찾아보았고, AI 융합 대학원을 위주로 찾아보게 되었습니다. 다행히 회사에 특수대학원을 다니는 주임님이 계셔서 많은 도움을 받았습니다만, 야간대학원 진학과 관련된 정보가 많지 않아 찾아보는데 조금 어려움을 겪었습니다. 혹시 저와 같은 분들이 또 계실까봐, 제 경험을 토대로 준비 과정을 간단하게 설명해드리고자 합니다!

우선 저는 총 4개의 원서 [연세대학교 공학대학원 인공지능융합학과/ 연세대학교 인공지능대학원 인공지능컴퓨팅학과/ 서강대학교 AI SW대학원 데이터사이언스·인공지능 전공/ 한양대학교 인공지능융합대학원 인공지능시스템학과]를 작성하였습니다. 저희 회사와 집이 2호선 라인에 있기 때문에 퇴근하고 이동이 용이할 수 있도록 2호선에 있는 학교만 지원하였습니다:) 

[서류 전형]

연세대학교는 다른 학교들과 다르게 서류 전형과 면접 전형이 분리되어 있습니다. 그래서 다른 학교는 지원하면 면접은 볼 수 있게 해주는데 연세대학교는 서류에서 떨어지면 면접의 기회조차 없게 되는 것이죠....😢 연세대학교 공학대학원의 지원 일정이 다른 학교들에 비해 빠른 편이었어서 제일 먼저 제출했었는데요, 안타깝게도 공학대학원은 서류전형에서 떨어지고 말았습니다. 아쉬움을 뒤로 한 채, 다른 학교 지원서를 작성하는 와중에 2025년 상반기 연세대학교 인공지능융합대학원이 신설된다는 소식을 알게 되었고, 부랴부랴 서류를 보완해서 다시 지원하게 되었습니다!

보통 대학원의 자기소개서는 자기소개, 진학동기, 연구계획 등의 문항으로 구성되어 있습니다. 분량도 자유이기 때문에 저는 문항 별로 1500~2000자 내외로 작성했습니다. 자기소개에서는 제가 지금 회사에서 하고 있는 일들과 인공지능에 관심을 갖게 된 계기에 대해 구체적으로 적었고, 진학동기와 연구 계획은 학교에서 어떤 공부를 하고 싶은지, 어떤 사람으로 성장하고 싶은지를 위주로 작성하였습니다. 각 학교별로 관심갖고 연구하시는 분야는 어떤지, 어떤 교수님의 연구실에서 어떤 연구가 진행되고 있는지를 찾아보고 작성하였습니다. 사실 3문항 다 비슷한 내용을 담을 수 밖에 없기 때문에 최대한 구체적으로 자세히 서술하려고 노력했습니다.

서류 제출은 연세대학교의 경우 모두 온라인으로 가능하지만, 서강대, 한양대는 우편으로 발송해야 했습니다. 물론 서면 제출도 가능했지만, 회사다니는 직장인에게 연차란 피와 같은 것이기에 저는 점심시간을 활용해 등기 우편을 부쳤습니다!  등기우편은 넉넉하게 2~3일 사이에 도착한다고 하는데, 저의 경우 월요일 점심시간에 부쳐서 수요일 오전에 도착했다는 카톡을 받았습니다. 빠른 우편으로 하면 바로 다음 날에도 도착한다고 하니, 시간이 빠듯하신 분들은 빠른 등기로 하시면 될 것 같아요. 생각보다 프린트하고 준비해야 할 것들이 꽤 있으니 미리미리 확인하시고 잘  챙겨서 꼭 시간 내에 제출하시길 바랍니다! 

[면접 전형]

AI, 머신러닝 관련된 내용이 면접 질문으로 나온다는 소식을 듣고 급하게 [혼자 공부하는 머신러닝+딥러닝] 책을 읽었습니다. 기초적인 내용이 있어서 학부시절 공부했던 것들을 복습하기에 좋은 책이었던것 같습니다. 책을 읽으면서 기억이 안나던 내용은 유튜브 강의를 들으면서 공부하였습니다. 

면접 복장은 고민하다 검정 자켓과 슬랙스, 코트를 입고 갔습니다. 넥타이까지 한 정장차림의 분들도 많으시더라구요. 단정하게만 입으시면 될 것 같습니다. 그리고 저는 긴장해서 그런지 자꾸 손끝이 차가워져서 핫팩 챙겨가길 잘했다고 생각이 들었습니다.. 핫팩 꼭 챙겨가시길 바랍니다..!

연세대학교 인공지능융합대학원 서류 전형은 다행히 합격하여서 3번의 면접 기회를 얻었습니다...만! 하필 제가 세 학교 모두 12월 7일 토요일, 비슷한 시간에 면접 기회를 얻게 되어서 고심 끝에 2번의 면접만 보게 되었습니다. 

한양대학교는 11시 30분 입실, 서강대학교는 12시 20분 입실, 연세대학교는 13시 30분 입실이 고지되었고, 저는 거리가 가까운 서강대학교와 연세대학교의 면접을 보기로 결심하였습니다. 서강대학교는 20분 단위로 대기실 입실이 정해져 있었고, 한양대는 10시와 11시반 2타임, 연세대는 13시  30분과 15시 30분으로 대기실 입실 시간이 정해져있는 것처럼 보였습니다. 

서강대학교 대학원은 20분 단위로 4~5명이 3조로 입실하여 면접을 보았습니다. 저는 12시 10분에 대기실에 도착하여서 30분까지 대기하다가, 면접 10분 전 다른 대기실로 이동하였습니다. 그리고 12시 40분에 면접장에 들어가 15분~20분 정도 면접을 보았습니다. 면접관으로 들어오신 교수님들은 2분이었고 각각 간단한 자기소개와 지원동기를 물어보신 후, 자료구조 관련된 질문을 2~3개씩 하셨습니다. 전공 수업을 잘 들었으면 무난히 대답할 수 있는 수준의 질문들이었고, 대답을 못할 경우 경험과 관련된 최대한 대답할 수 있는 질문들로 대체해주시는 것 같았습니다.

연세대학교는 20분 단위로 4~5명이 1조로 입실하여 면접을 본 것 같았습니다. 그래서 대기시간도 길었는데 저는 1시 10분에 입실하여  거의 4시까지 대기하고 면접을 볼 수 있었습니다. 교수님들은 4분이 앉아계셨는데, 편안한 분위기로 긴장하지 않게 웃으면서 질문해주셨습니다.(그런데도 긴장해서 말 더듬은 사람 나야 나...)
듣기로 한양대학교는 면접에서 머신러닝과 관련된 질문들이 꽤 나왔다고 합니다.

그래서 결과는요..?!

서강대학교 AI SW대학원에 합격하였습니다🎉
서강대와 연세대 두 곳 다 예정된 발표일자보다 하루 일찍 발표가 났습니다! 오랜 대학 생활을 겨우 끝내고 다시 대학원 생활을 할 생각을 하니 조금 아득하기도 하지만 그래도 설레고 행복한 기분이 더 큰 것 같습니다. 이 설레는 기분 잊지 않고 4학기의 대학원 생활도 잘 헤쳐나가보겠습니다...! 감사합니다

  • 전국대학원 홈페이지(http://www.gradmap.co.kr/)
    대학원 진학과 관련된 대부분의 정보들은 위 사이트에서 확인하실 수 있습니다. 세부 내용이야 각 학교 사이트에서 확인하셔야겠지만 대략적인 가이드나 지원 시기 등을 확인할 수 있는 굉장히 유용한 사이트였습니다.

 

가끔 Git에 push를 하려고 하면, 용량이 너무 커서 올릴 수 없다는 다음과 같은 메시지를 받을 때가 있다!

warning: redirecting to https://gitlab.~~~~~~~
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: expected 'packfile'

이 문제를 해결하기 위해 나는 Git LFS를 사용하였다. Git LFS는 Large File Storage의 약자로 용량이 큰 파일을 제어할 수 있는 시스템이다. GIT은 기본적으로 100mb가 넘는 파일을 한 번에 올릴 수 없게 설정해 두었다. 

1. GIT LFS 설치
Window에서는 다음과 같은 간단한 명령어로 git lfs를 설치할 수 있다.

git lfs install

2. LFS에서 트래킹 할 파일 설정
문제가 되는 용량이 큰 파일들을 tracking할 수 있게, 설정해 준다. 필자의 경우 tar파일이 문제였기 때문에 "*. tar"로 설정해 주었다.

git lfs track "*.tar"

3. .gitattributes  관리

git add .gitattributes

lfs와 관련된 내용들은 .gitattributes에서 관리하기 때문에 해당 파일도 꼭 add 해주어야 한다.
다음으로는 평소와 같이 `git add .`과 `git commit -m "커밋메시지 작성"`을 해주면 된다!

추가로, 이미 용량이 큰 파일을 커밋하고 push 하다가 에러가 난 경우 해당 커밋 내역을 unstaging 하고 올려주어야 한다!!

git rm --cached <file path>

원격 레포에 큰 파일이 정상적으로 올라가 있는 것을 볼 수 있다~

'GIT' 카테고리의 다른 글

[GIT] .git/hooks로 템플릿 형태 체크하기!  (0) 2024.09.27
[GIT] commit msg template 적용  (0) 2024.09.11
Git이란 무엇인가?  (0) 2023.12.05

데이터베이스 정규화란?

데이터베이스 정규화는 데이터베이스 설계에서 중복 데이터를 줄이는 것으로, 이를 통해 데이터 무결성을 유지하고 DB저장 용량을 줄일 수 있다. 이를 통해 테이블 구조를 효율적으로 만들고 데이터 삽입 ,삭제,수정 시 발생할 수 있는 이상 현상을 방지한다.

삽입 이상(Insertion Anomaly): 새 데이터를 삽입할 때, 의도치 않은 데이터가 삽입됨으로써 생기는 데이터 불일치
삭제 이상(Deletion Anomaly): 데이터를 삭제할 때 의도치 않은 데이터까지 삭제됨으로써 생기는 데이터의 불일치
갱신이상(Modification Anomaly): 중복된 데이터 중 일부를 갱신할 때 의도치 않은 데이터가 갱신됨으로써 생기는 데이터의 불일치

1. 제 1 정규형(원자성)

모든 열이 원자값(하나의 값)을 가져야 한다. 중첩된 테이블이나 복수의 값을 허용하는 칼럼을 제거한다.

제 1 정규화 예시


2. 제 2 정규형(부분 함수 종속성 제거)

기본 키가 아닌 속성이 기본 키의 부분집합에 종속되지 않도록 한다. 다음 테이블의 기본키는 학생 번호와 수강과목으로 구성되어 있는데, 성적은 두가지 값을 모두 사용해서 값이 정해지지만, 강의실은 강좌이름으로 결정이 되기 때문에 부분 함수 종속성에 해당한다. 따라서 강의실과 강좌이름을 다른 테이블로 분리해야한다. 즉, 기본 키의 일부에만 의존하는 칼럼을 제거하여 부분 함수 종속성을 없앤다.

제 2 정규화 예시

3. 제 3 정규형(이행적 종속성 제거)

기본키가 아닌 모든 속성이 기본키에만 종속되도록 한다. 기본 키 이외의 다른 속성에 의존하는 칼럼을 제거한다. 이행적 종속이란 A->B, B->C일 때, A->C 인 경우를 의미한다. 한 테이블에서 저런 구조를 가지고 있는 경우를 제거하는 것이 제 3 정규의 목표이다.

제 3 정규화 예시

4. BCNF(Boyce-Code Normal Form)

모든 결정자가 후보키여야 한다. 즉, 후보키가 아닌 속성은 다른 어떤 속성에도 종속되지 않아야 한다.

후보키란 최소성과 유일성을 만족하는 속성의 집합을 의미한다. 

 

5. 제 4 정규형(다치 종속성 제거)

하나의 테이블에서 여러 독립적인 다치 종속성을 분리한다.

6. 제 5 정규형(조인 종속성 제거)

테이블을 분해하더라도 데이터를 잃지 않고 다시 조인할 수 있어야 한다.

정규화의 장점

1) 중복 데이터 최소화

2) 데이터 무결성 유지

3) 효율적인 쿼리 구조

정규화의 단점

복잡성 증가. 

반정규화

데이터베이스 성능 향상을 위해 데이터의 중복을 허용하는 정규화의 반대 의미. 정규화를 통해 종속성과 활용성은 향상되었지만, Join을 많이하고 다량의 범위를 자주 처리해야하는 경우 수행속도가 느려져 반정규화를 수행하기도 한다.
계산 칼럼 추가, 테이블 수직 분할, 테이블 수평 분할, 테이블 병합 등으로 반정규화를 실행할 수 있다.

자바는 객체지향 언어로, 객체지향 프로그래밍을 설계할 때 지켜야 할 5대 원칙이 존재한다.

1.  Single Responsibility Principle

단일 책임 원칙이란 모든 클래스가 하나의 책임 만을 가져야 한다는 의미이다. 한 클래스를 만들 때, 여러 기능을 모아두지 말고, 각 목적과 취지에 맞게 속성과 method를 구성함으로 관련된 책임만 줄 것을 의미한다.

2. Open Closed Principle

개방 폐쇄 원칙은 유지 보수사항이 생겼을 때, 코드를 쉽게 확장할 수 있도록 하고, 수정할 때는 닫혀있어야 한다는 원칙이다.

3. Liskov Substitution Principle

리스코프 치환 원칙은 프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다는 의미이다. 클래스는 상속을 통해 부모 자식의 계층관계가 만들어지는데, 부모 객체에 자식을 넣어도 문제 없이 돌어가게 만드는 것을 의미한다.

4. Interface Segregation Principle

인터페이스 분리 원칙은 하나의 일반적인 인터페이스보다 구체적인 여러개의 인터페이스를 만들어야 한다는 원칙이다. 

5. Dependency Inversion Principle

의존 역전 원칙은 추상화 된 인터페이스나 상위 클래스를 통해 변화에 영향받지 않도록 하는 것을 말한다. 즉, 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 함을 의미한다. 

이번에 정리할 내용은 자바의 기본 개념인 oop의 특징 4가지 중 상속과 다형성에 관련된 내용이다. 추상화와 캡슐화는 이전 링크 참고!

https://bl-nk.tistory.com/113

 

[BackEnd]Java란 무엇인가: OOP(1) Abatraction&Encapsulation

Java: High level, Object-Oriented Language자바는 Sun Microsystem의 제임스 고슬링에 의해 1995 처음 개발한 언어로, 어떤 환경이든 JVM만 있으면 구동할 수 있게 만들어진 언어이다. 주로 큰 스케일의 엔터프라

bl-nk.tistory.com


(3) Inheritance

자바에서 상속이란 부모 클래스, 인터페이스의 내용을 자식이 물려받아 사용하는 것을 말한다. 상속을 통해 메서드 오버라이딩을 할 수 있고, 재사용을 통해 동일한 코드의 반복을 줄일 수 있다는 장점이 있다. 자바의 상속은 부모와 자식의 관계를 IS-A 관계로 설명한다. 자식은 부모가 가진 모든 것을 사용하고 재 정의할 수 있다. 자바에서는 복잡성을 줄이기 위해, 하나의 클래스는 하나의 클래스만 상속받게 되어 있다. 두개의 클래스를 하나의 클래스가 상속받으려고 하면 compile에러가 발생한다.

(4) Polymorphism

자바에서 다형성은 하나의 액션을 다른 방법으로 할 수 있게 하는 개념이다. 크게 compile-time 다형성과 run-time 다형성으로 구분된다. Runtime 다형성은 메서드 오버로딩을 말한다. 자식이 상속하고 있는 부모의 메서드를 사용하는 것을 메서드 오버로딩이라고 하는데, Upcasting으로 선언할 때 발생한다. 부모의 클래스를 자식 클래스로 선언했을 때, 해당 객체의 메서드는 오버로딩 된 자식의 메서드가 실행되는 것을 의미한다. 단, 변수의 경우는 override의 개념이 없기 때문에, upcasting을 한 경우, 부모와 자식이 동일한 이름의 변수를 가지고 있을 경우 부모 클래스의 변수를 읽어오게 된다.

Upcating: 부모클래스를 상속받은 자식 클래스로 선언하는 것을 의미한다.

class Test{
	class A{
    	int variable=12;
        void run(){
        	System.out.println("Hello");
        }
    }
	class B extends A{
    	int variable=9;
        @Override
        void run(){
        	System.out.println("Hello, It's blank");
        }
    }
	public static void main(String args){
	    A a = new B();//Upcasting의 예시
        System.out.println(a.variable);	//출력값: 12
        a.run();	//출력값: Hello, It's blank
        
        A realA = new A();
        System.out.println(a.variable);	//출력값:12
        realA.run();	//출력값: Hello
    }	
}

* Override와 Overload의 차이

Override는 자식이 부모의 메서드를 상속받아 재정의 하는 것을 의미한다. 파라미터의 개수, 자료형이 달라야 하고, 리턴형은 같아야 한다. Overload는 같은 이름을 가진 메서드이지만 다른 파라미터를 사용하는 경우를 의미한다. 리턴형은 같아도 되고 달라도 된다! 둘의 공통점은 Over로 시작한다. 같은 이름을 가진 메서드를 다른 방법으로 풀어낸다는 것이다.

+ Recent posts