<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>record my life</title>
    <link>https://yjinstudy.tistory.com/</link>
    <description>peacemiller@naver.com</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 09:21:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>아커만</managingEditor>
    <item>
      <title>파이썬 CSV 파일 저장하는 방법: 리스트와 딕셔너리 예제까지</title>
      <link>https://yjinstudy.tistory.com/35</link>
      <description>&lt;h1&gt;파이썬 CSV 파일 저장하는 방법: 리스트와 딕셔너리 예제까지&lt;/h1&gt;

&lt;p&gt;파이썬으로 데이터를 정리하다 보면 엑셀보다 먼저 CSV 파일로 저장해야 하는 경우가 많습니다. 특히 &lt;strong&gt;파이썬 CSV 저장&lt;/strong&gt; 방법은 업무 자동화, 크롤링 결과 정리, 로그 백업 같은 작업에서 자주 쓰입니다. 이번 글에서는 &lt;strong&gt;파이썬 CSV 저장&lt;/strong&gt;을 처음 해보는 분도 바로 따라 할 수 있게 가장 쉬운 예제부터 실무에서 자주 만나는 문제까지 정리해보겠습니다.&lt;/p&gt;

&lt;h2&gt;CSV 파일이 왜 자주 쓰일까?&lt;/h2&gt;
&lt;p&gt;CSV는 데이터를 쉼표로 구분해서 저장하는 아주 단순한 형식입니다. 단순하지만 그만큼 호환성이 좋아서 파이썬, 엑셀, 구글 스프레드시트, 데이터 분석 도구에서 모두 쉽게 열 수 있습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;엑셀 없이도 표 형식 데이터를 저장할 수 있습니다.&lt;/li&gt;
  &lt;li&gt;크롤링 결과나 자동화 결과를 빠르게 백업할 수 있습니다.&lt;/li&gt;
  &lt;li&gt;다른 프로그램으로 넘기기 쉬워서 실무에서 자주 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;파이썬 CSV 저장 기본 방법&lt;/h2&gt;
&lt;p&gt;가장 기본은 파이썬 내장 모듈인 &lt;code&gt;csv&lt;/code&gt;를 사용하는 것입니다. 별도 설치가 필요 없어서 초보자도 바로 시작할 수 있습니다.&lt;/p&gt;

&lt;h3&gt;1. 리스트 데이터를 CSV로 저장하기&lt;/h3&gt;
&lt;p&gt;행 단위 데이터가 리스트로 정리되어 있다면 &lt;code&gt;writerow()&lt;/code&gt; 또는 &lt;code&gt;writerows()&lt;/code&gt;를 사용하면 됩니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

rows = [
    [&quot;이름&quot;, &quot;부서&quot;, &quot;점수&quot;],
    [&quot;민지&quot;, &quot;마케팅&quot;, 92],
    [&quot;준호&quot;, &quot;개발&quot;, 88],
    [&quot;서연&quot;, &quot;디자인&quot;, 95]
]

with open(&quot;scores.csv&quot;, &quot;w&quot;, newline=&quot;&quot;, encoding=&quot;utf-8-sig&quot;) as file:
    writer = csv.writer(file)
    writer.writerows(rows)

print(&quot;CSV 저장 완료&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;위 코드를 실행하면 &lt;code&gt;scores.csv&lt;/code&gt; 파일이 생성되고, 각 리스트가 한 줄씩 저장됩니다.&lt;/p&gt;

&lt;h3&gt;2. 한 줄씩 추가해서 저장하기&lt;/h3&gt;
&lt;p&gt;반복문 안에서 데이터를 하나씩 모으는 경우에는 &lt;code&gt;writerow()&lt;/code&gt;가 더 편합니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;members.csv&quot;, &quot;w&quot;, newline=&quot;&quot;, encoding=&quot;utf-8-sig&quot;) as file:
    writer = csv.writer(file)
    writer.writerow([&quot;이름&quot;, &quot;나이&quot;, &quot;도시&quot;])
    writer.writerow([&quot;지훈&quot;, 27, &quot;서울&quot;])
    writer.writerow([&quot;유진&quot;, 31, &quot;부산&quot;])
    writer.writerow([&quot;하늘&quot;, 25, &quot;인천&quot;])&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;헤더를 먼저 쓰고, 그 아래에 데이터를 한 줄씩 추가하는 방식입니다. 실무에서는 이 패턴이 가장 자주 나옵니다.&lt;/p&gt;

&lt;h2&gt;딕셔너리를 CSV 파일로 저장하는 방법&lt;/h2&gt;
&lt;p&gt;실무에서는 리스트보다 딕셔너리 형태 데이터가 더 많이 나옵니다. 예를 들어 API 응답, 크롤링 결과, 사용자 정보처럼 항목명이 명확한 데이터는 &lt;code&gt;DictWriter&lt;/code&gt;가 훨씬 편합니다.&lt;/p&gt;

&lt;h3&gt;3. 딕셔너리 리스트 저장하기&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

rows = [
    {&quot;이름&quot;: &quot;민지&quot;, &quot;이메일&quot;: &quot;minji@example.com&quot;, &quot;가입일&quot;: &quot;2026-04-29&quot;},
    {&quot;이름&quot;: &quot;준호&quot;, &quot;이메일&quot;: &quot;junho@example.com&quot;, &quot;가입일&quot;: &quot;2026-04-28&quot;},
    {&quot;이름&quot;: &quot;서연&quot;, &quot;이메일&quot;: &quot;seoyeon@example.com&quot;, &quot;가입일&quot;: &quot;2026-04-27&quot;}
]

fieldnames = [&quot;이름&quot;, &quot;이메일&quot;, &quot;가입일&quot;]

with open(&quot;users.csv&quot;, &quot;w&quot;, newline=&quot;&quot;, encoding=&quot;utf-8-sig&quot;) as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(rows)

print(&quot;딕셔너리 CSV 저장 완료&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;writeheader()&lt;/code&gt;는 첫 줄에 컬럼명을 자동으로 써줍니다. 딕셔너리 키가 많아질수록 이 방식이 훨씬 관리하기 쉽습니다.&lt;/p&gt;

&lt;h2&gt;실무에서 자주 쓰는 CSV 저장 예제&lt;/h2&gt;

&lt;h3&gt;크롤링 결과 저장&lt;/h3&gt;
&lt;p&gt;예를 들어 쇼핑몰 상품명과 가격을 수집했다면 아래처럼 바로 CSV로 저장할 수 있습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

products = [
    {&quot;상품명&quot;: &quot;무선 키보드&quot;, &quot;가격&quot;: 39000},
    {&quot;상품명&quot;: &quot;노트북 거치대&quot;, &quot;가격&quot;: 27000},
    {&quot;상품명&quot;: &quot;USB 허브&quot;, &quot;가격&quot;: 18900}
]

with open(&quot;products.csv&quot;, &quot;w&quot;, newline=&quot;&quot;, encoding=&quot;utf-8-sig&quot;) as file:
    writer = csv.DictWriter(file, fieldnames=[&quot;상품명&quot;, &quot;가격&quot;])
    writer.writeheader()
    writer.writerows(products)&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;반복 작업 결과 저장&lt;/h3&gt;
&lt;p&gt;폴더 정리, 메일 발송, 파일 검사 같은 자동화 작업을 했다면 결과 로그를 CSV로 남겨두는 것도 좋습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

logs = [
    [&quot;파일명&quot;, &quot;처리결과&quot;],
    [&quot;report1.pdf&quot;, &quot;성공&quot;],
    [&quot;report2.pdf&quot;, &quot;성공&quot;],
    [&quot;report3.pdf&quot;, &quot;실패&quot;]
]

with open(&quot;work_log.csv&quot;, &quot;w&quot;, newline=&quot;&quot;, encoding=&quot;utf-8-sig&quot;) as file:
    writer = csv.writer(file)
    writer.writerows(logs)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이렇게 저장해두면 나중에 어떤 파일이 처리됐고 어떤 파일이 실패했는지 한눈에 확인할 수 있습니다.&lt;/p&gt;

&lt;h2&gt;파이썬 CSV 저장할 때 주의할 점&lt;/h2&gt;

&lt;h3&gt;1. &lt;code&gt;newline=&quot;&quot;&lt;/code&gt;를 꼭 넣기&lt;/h3&gt;
&lt;p&gt;윈도우 환경에서는 &lt;code&gt;newline=&quot;&quot;&lt;/code&gt;를 빼면 줄 사이에 빈 줄이 하나씩 더 들어갈 수 있습니다. CSV 저장할 때는 거의 습관처럼 넣는 것이 좋습니다.&lt;/p&gt;

&lt;h3&gt;2. 한글이 깨지면 &lt;code&gt;utf-8-sig&lt;/code&gt; 확인하기&lt;/h3&gt;
&lt;p&gt;엑셀에서 CSV를 열었을 때 한글이 깨지는 경우가 있습니다. 이런 경우에는 &lt;code&gt;encoding=&quot;utf-8-sig&quot;&lt;/code&gt;로 저장하면 해결되는 경우가 많습니다.&lt;/p&gt;

&lt;h3&gt;3. 쉼표가 들어간 데이터 주의하기&lt;/h3&gt;
&lt;p&gt;주소나 설명 문장처럼 값 안에 쉼표가 포함될 수 있습니다. 이런 경우에도 &lt;code&gt;csv&lt;/code&gt; 모듈을 사용하면 자동으로 적절히 처리해주기 때문에 문자열을 직접 이어 붙여 저장하는 방식보다 안전합니다.&lt;/p&gt;

&lt;h3&gt;4. 컬럼 순서를 미리 정하기&lt;/h3&gt;
&lt;p&gt;딕셔너리를 CSV로 저장할 때는 &lt;code&gt;fieldnames&lt;/code&gt; 순서를 명확히 정해두는 것이 좋습니다. 그래야 파일 구조가 매번 바뀌지 않고, 후속 처리도 쉬워집니다.&lt;/p&gt;

&lt;h2&gt;언제 이 방법을 쓰면 좋을까?&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;크롤링한 데이터를 엑셀로 보기 쉽게 정리하고 싶을 때&lt;/li&gt;
  &lt;li&gt;반복 업무 결과를 파일로 남기고 싶을 때&lt;/li&gt;
  &lt;li&gt;API 응답 데이터를 표 형식으로 저장하고 싶을 때&lt;/li&gt;
  &lt;li&gt;나중에 pandas나 엑셀로 다시 불러올 데이터를 먼저 저장할 때&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;FAQ&lt;/h2&gt;

&lt;h3&gt;Q1. 파이썬 CSV 저장은 pandas 없이도 가능한가요?&lt;/h3&gt;
&lt;p&gt;가능합니다. 오히려 간단한 저장 작업은 &lt;code&gt;csv&lt;/code&gt; 내장 모듈이 더 가볍고 빠릅니다. 표 형태 데이터를 단순히 저장하는 목적이라면 pandas 없이도 충분합니다.&lt;/p&gt;

&lt;h3&gt;Q2. CSV 파일을 엑셀로 열면 한글이 깨지는 이유는 뭔가요?&lt;/h3&gt;
&lt;p&gt;대부분 인코딩 문제입니다. 엑셀에서 한글 깨짐을 줄이려면 &lt;code&gt;utf-8-sig&lt;/code&gt;로 저장해보는 것이 가장 쉽습니다. 인코딩 개념이 헷갈린다면 기존 글인 &lt;a href=&quot;https://yjinstudy.tistory.com/11&quot;&gt;[파이썬] 인코딩 &amp;amp; 디코딩&lt;/a&gt;도 함께 보면 도움이 됩니다.&lt;/p&gt;

&lt;h3&gt;Q3. 리스트와 딕셔너리 중 어떤 방식으로 저장하는 게 좋나요?&lt;/h3&gt;
&lt;p&gt;컬럼 이름이 분명한 데이터라면 딕셔너리가 더 좋습니다. 반대로 단순한 표 형태라면 리스트 저장이 더 빠르고 코드도 짧습니다.&lt;/p&gt;

&lt;h3&gt;Q4. CSV 저장 전에 먼저 파일 읽기부터 알아야 하나요?&lt;/h3&gt;
&lt;p&gt;꼭 그렇지는 않지만 파일 입출력 개념을 함께 이해하면 훨씬 쉬워집니다. 기초가 필요하면 &lt;a href=&quot;https://yjinstudy.tistory.com/6&quot;&gt;[파이썬] 파일 열어서 읽기&lt;/a&gt; 글도 같이 보면 좋습니다.&lt;/p&gt;

&lt;h3&gt;Q5. 저장한 CSV에서 특정 패턴만 뽑아내고 싶다면 어떻게 하나요?&lt;/h3&gt;
&lt;p&gt;이럴 때는 정규식이 유용합니다. 예를 들어 이메일, 전화번호, 특정 문자열 패턴을 추출할 때는 &lt;a href=&quot;https://yjinstudy.tistory.com/8&quot;&gt;[파이썬] 정규식 (regular expression)&lt;/a&gt; 글과 함께 보면 연결해서 이해하기 좋습니다.&lt;/p&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;이번 글에서는 &lt;strong&gt;파이썬 CSV 저장&lt;/strong&gt; 방법을 리스트 예제와 딕셔너리 예제로 나눠서 정리했습니다. 처음에는 단순히 파일 한 개 저장하는 것처럼 보여도, 익숙해지면 크롤링 결과 정리, 자동화 로그 저장, 데이터 백업 같은 실무 작업에 바로 연결할 수 있습니다.&lt;/p&gt;

&lt;p&gt;다음 단계에서는 CSV를 저장하는 것에서 끝내지 않고, 저장한 파일을 다시 읽어서 가공하는 흐름까지 이어가면 실력이 더 빨리 붙습니다. 그리고 문자열 패턴 추출이 필요할 때는 &lt;a href=&quot;https://yjinstudy.tistory.com/8&quot;&gt;정규식 글&lt;/a&gt;, 한글 깨짐이 생길 때는 &lt;a href=&quot;https://yjinstudy.tistory.com/11&quot;&gt;인코딩 글&lt;/a&gt;, 파일 입출력 기초를 먼저 보고 싶다면 &lt;a href=&quot;https://yjinstudy.tistory.com/6&quot;&gt;파일 읽기 글&lt;/a&gt;도 함께 참고해보세요.&lt;/p&gt;</description>
      <category>coding</category>
      <category>CSV</category>
      <category>csv쓰기</category>
      <category>Python</category>
      <category>업무자동화</category>
      <category>파이썬</category>
      <category>파이썬csv</category>
      <category>파이썬실무</category>
      <category>파일저장</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/35</guid>
      <comments>https://yjinstudy.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 29 Apr 2026 23:03:45 +0900</pubDate>
    </item>
    <item>
      <title>파이썬으로 CSV 파일 읽기: 초보자도 이해하는 예제</title>
      <link>https://yjinstudy.tistory.com/34</link>
      <description>&lt;h1&gt;파이썬으로 CSV 파일 읽기: 초보자도 이해하는 예제&lt;/h1&gt;

&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQRGTl/dJMcaiQCMaQ/cF0mT4v2tu8vUESy2ldQPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQRGTl/dJMcaiQCMaQ/cF0mT4v2tu8vUESy2ldQPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQRGTl/dJMcaiQCMaQ/cF0mT4v2tu8vUESy2ldQPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQRGTl%2FdJMcaiQCMaQ%2FcF0mT4v2tu8vUESy2ldQPk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;


&lt;p&gt;파이썬 csv 읽기는 엑셀이나 데이터 파일을 다룰 때 가장 먼저 익혀두면 좋은 기본 작업입니다. 특히 저장된 회원 목록, 매출 데이터, 설문 결과처럼 표 형태의 자료를 불러올 때 &lt;strong&gt;파이썬 csv 읽기&lt;/strong&gt;만 알아도 할 수 있는 일이 꽤 많아집니다. 이번 글에서는 초보자도 이해할 수 있도록 CSV 파일을 읽는 가장 쉬운 방법부터 한글 파일을 다룰 때 주의할 점까지 정리해보겠습니다.&lt;/p&gt;

&lt;h2&gt;CSV 파일이란 무엇일까?&lt;/h2&gt;
&lt;p&gt;CSV는 &lt;strong&gt;Comma-Separated Values&lt;/strong&gt;의 약자로, 쉼표를 기준으로 데이터를 나눈 텍스트 파일입니다. 엑셀처럼 표 데이터를 저장할 수 있지만 파일 구조는 훨씬 단순해서 프로그램으로 읽고 쓰기 쉽습니다.&lt;/p&gt;
&lt;p&gt;예를 들어 아래처럼 생긴 파일이 CSV입니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;name,age,city
Alice,25,Seoul
Bob,31,Busan
Charlie,28,Incheon&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이 데이터를 파이썬으로 읽으면 행 단위로 처리할 수 있고, 필요한 열만 골라서 사용할 수도 있습니다.&lt;/p&gt;

&lt;h2&gt;파이썬에서 CSV 파일 읽는 가장 기본적인 방법&lt;/h2&gt;
&lt;p&gt;파이썬 표준 라이브러리에는 &lt;strong&gt;csv&lt;/strong&gt; 모듈이 있어서 별도 설치 없이 바로 사용할 수 있습니다.&lt;/p&gt;

&lt;h3&gt;1. 기본 예제&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;people.csv&quot;, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
    reader = csv.reader(file)
    
    for row in reader:
        print(row)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;실행 결과는 아래처럼 나옵니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;['name', 'age', 'city']
['Alice', '25', 'Seoul']
['Bob', '31', 'Busan']
['Charlie', '28', 'Incheon']&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;즉, 한 줄씩 읽어서 리스트 형태로 가져온다고 생각하면 이해하기 쉽습니다.&lt;/p&gt;

&lt;h3&gt;언제 이 방법을 쓰면 좋을까?&lt;/h3&gt;
&lt;p&gt;파일 구조가 단순하고, 각 행을 순서대로 읽어서 처리하면 되는 경우에 적합합니다. 예를 들어 이름 목록, 주문 내역, 간단한 로그 파일처럼 열 개수가 정해진 데이터를 다룰 때 편리합니다.&lt;/p&gt;

&lt;h2&gt;헤더를 제외하고 데이터만 읽는 방법&lt;/h2&gt;
&lt;p&gt;실무에서는 첫 줄이 제목 행인 경우가 많습니다. 이럴 때는 첫 줄을 건너뛰고 읽는 경우가 많습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;people.csv&quot;, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
    reader = csv.reader(file)
    next(reader)  # 헤더 한 줄 건너뛰기

    for row in reader:
        print(row)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;next(reader)&lt;/strong&gt;를 사용하면 첫 번째 줄을 한 번 읽고 넘어가기 때문에 이후 반복문에서는 실제 데이터만 처리할 수 있습니다.&lt;/p&gt;

&lt;h2&gt;열 이름으로 읽고 싶다면 DictReader 사용하기&lt;/h2&gt;
&lt;p&gt;열 순서를 외우지 않고 &lt;strong&gt;컬럼 이름 기준&lt;/strong&gt;으로 데이터를 읽고 싶다면 &lt;strong&gt;csv.DictReader&lt;/strong&gt;가 더 편합니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;people.csv&quot;, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
    reader = csv.DictReader(file)

    for row in reader:
        print(row[&quot;name&quot;], row[&quot;city&quot;])&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이 방식은 코드 가독성이 좋아서 초보자에게도 추천할 만합니다. 특히 열 개수가 많아질수록 인덱스보다 키 이름으로 접근하는 편이 실수를 줄이기 좋습니다.&lt;/p&gt;

&lt;h2&gt;실무에서 자주 쓰는 예제&lt;/h2&gt;
&lt;p&gt;아래는 CSV에서 특정 조건의 데이터만 찾는 간단한 예제입니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;people.csv&quot;, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
    reader = csv.DictReader(file)

    for row in reader:
        if int(row[&quot;age&quot;]) &gt;= 30:
            print(f'{row[&quot;name&quot;]} / {row[&quot;age&quot;]} / {row[&quot;city&quot;]}')&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이런 식으로 읽어온 데이터를 조건문과 함께 쓰면, 나이가 30 이상인 사람만 추리거나 특정 지역 데이터만 분리하는 작업도 쉽게 할 수 있습니다.&lt;/p&gt;

&lt;h3&gt;실무 활용 포인트&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;회원 목록에서 특정 조건에 맞는 사람만 추리기&lt;/li&gt;
  &lt;li&gt;주문 데이터에서 금액이 큰 항목만 찾기&lt;/li&gt;
  &lt;li&gt;엑셀에서 저장한 CSV를 읽어 다른 파일로 가공하기&lt;/li&gt;
  &lt;li&gt;자동화 스크립트의 입력 데이터로 활용하기&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;한글 CSV 파일을 읽을 때 주의할 점&lt;/h2&gt;
&lt;p&gt;한국어 CSV를 다룰 때 가장 많이 막히는 부분은 &lt;strong&gt;인코딩&lt;/strong&gt;입니다. 파일은 멀쩡해 보이는데 파이썬에서 읽을 때 한글이 깨지거나 오류가 나는 경우가 있습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;data.csv&quot;, &quot;r&quot;, encoding=&quot;cp949&quot;) as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;엑셀에서 저장한 한글 CSV는 &lt;strong&gt;cp949&lt;/strong&gt;로 저장된 경우가 많고, 웹이나 개발 환경에서 만든 CSV는 &lt;strong&gt;utf-8&lt;/strong&gt;인 경우가 많습니다. 따라서 파일이 안 읽히면 인코딩을 먼저 의심하는 습관이 중요합니다.&lt;/p&gt;

&lt;h3&gt;왜 이 부분이 중요할까?&lt;/h3&gt;
&lt;p&gt;CSV 읽기 자체보다도, 실제 현업에서는 인코딩 문제 때문에 시간을 더 많이 쓰는 경우가 많습니다. 그래서 단순히 코드만 외우기보다 파일이 어떤 환경에서 만들어졌는지도 함께 보는 것이 좋습니다.&lt;/p&gt;

&lt;h2&gt;파이썬 csv 읽기에서 자주 하는 실수&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;인코딩을 지정하지 않아서 한글이 깨지는 경우&lt;/li&gt;
  &lt;li&gt;헤더를 데이터로 같이 처리해서 결과가 꼬이는 경우&lt;/li&gt;
  &lt;li&gt;숫자 데이터를 문자열 그대로 비교하는 경우&lt;/li&gt;
  &lt;li&gt;쉼표가 아닌 다른 구분자를 쓰는 파일인데 기본 설정으로 읽는 경우&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;특히 나이나 금액처럼 숫자로 비교해야 하는 값은 &lt;strong&gt;int()&lt;/strong&gt;나 &lt;strong&gt;float()&lt;/strong&gt;로 변환해서 처리해야 원하는 결과가 나옵니다.&lt;/p&gt;

&lt;h2&gt;구분자가 쉼표가 아닐 때는 어떻게 할까?&lt;/h2&gt;
&lt;p&gt;가끔 CSV처럼 보이지만 실제로는 탭이나 세미콜론으로 구분된 파일도 있습니다. 이럴 때는 &lt;strong&gt;delimiter&lt;/strong&gt; 옵션을 지정하면 됩니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import csv

with open(&quot;data.csv&quot;, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
    reader = csv.reader(file, delimiter=&quot;;&quot;)
    
    for row in reader:
        print(row)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;파일을 열어봤는데 한 줄 전체가 하나의 값처럼 들어온다면, 인코딩뿐 아니라 구분자도 함께 확인해보는 것이 좋습니다.&lt;/p&gt;

&lt;h2&gt;자주 묻는 질문 FAQ&lt;/h2&gt;

&lt;h3&gt;Q1. 파이썬에서 CSV 파일 읽을 때 꼭 csv 모듈을 써야 하나요?&lt;/h3&gt;
&lt;p&gt;간단한 텍스트 처리라면 &lt;strong&gt;open()&lt;/strong&gt;으로 직접 읽을 수도 있지만, CSV는 구분자와 줄 단위 처리 규칙이 있어서 보통은 &lt;strong&gt;csv 모듈&lt;/strong&gt;을 사용하는 편이 더 안전하고 편합니다.&lt;/p&gt;

&lt;h3&gt;Q2. utf-8로 읽었는데 오류가 나면 어떻게 해야 하나요?&lt;/h3&gt;
&lt;p&gt;한글 CSV 파일이라면 &lt;strong&gt;cp949&lt;/strong&gt;나 &lt;strong&gt;utf-8-sig&lt;/strong&gt;로 다시 시도해보는 것이 좋습니다. 특히 엑셀에서 저장한 파일은 cp949인 경우가 많습니다.&lt;/p&gt;

&lt;h3&gt;Q3. csv.reader와 DictReader 중 무엇을 쓰는 게 좋나요?&lt;/h3&gt;
&lt;p&gt;열 개수가 적고 순서가 명확하면 &lt;strong&gt;csv.reader&lt;/strong&gt;도 충분합니다. 하지만 컬럼 이름으로 읽는 편이 이해하기 쉽고 실수도 적어서 초보자라면 &lt;strong&gt;DictReader&lt;/strong&gt;를 더 추천합니다.&lt;/p&gt;

&lt;h3&gt;Q4. CSV 파일을 읽은 뒤 바로 엑셀처럼 다룰 수 있나요?&lt;/h3&gt;
&lt;p&gt;CSV는 기본적으로 텍스트 데이터입니다. 읽은 뒤에는 리스트나 딕셔너리 형태로 처리하게 되며, 엑셀 파일처럼 서식까지 포함해서 다루려면 openpyxl 같은 별도 도구가 필요합니다.&lt;/p&gt;

&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;이번 글에서는 파이썬 csv 읽기의 기본 개념, csv.reader 사용법, DictReader 활용, 한글 인코딩 주의점까지 한 번에 정리했습니다. 처음에는 간단한 예제로 시작하고, 익숙해지면 조건 검색이나 자동화 입력 파일 처리까지 확장해보면 좋습니다.&lt;/p&gt;

&lt;p&gt;한글 CSV를 읽다가 글자가 깨지거나 &lt;strong&gt;UnicodeDecodeError&lt;/strong&gt;가 났다면 &lt;a href=&quot;https://yjinstudy.tistory.com/31&quot;&gt;파이썬 CSV 한글 깨짐 해결 방법&lt;/a&gt; 글을 같이 보면 바로 도움이 됩니다. 파일을 여는 기본 문법이 아직 익숙하지 않다면 &lt;a href=&quot;https://yjinstudy.tistory.com/6&quot;&gt;파이썬 파일 열어서 읽기&lt;/a&gt;, 문자열 패턴 처리까지 연결해서 공부하고 싶다면 &lt;a href=&quot;https://yjinstudy.tistory.com/7&quot;&gt;파이썬 정규식 (regular expression)&lt;/a&gt; 글도 함께 읽어보세요.&lt;/p&gt;</description>
      <category>coding</category>
      <category>CSV</category>
      <category>Python</category>
      <category>데이터처리</category>
      <category>파이썬</category>
      <category>파이썬실무</category>
      <category>파이썬예제</category>
      <category>파이썬입문</category>
      <category>파일자동화</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/34</guid>
      <comments>https://yjinstudy.tistory.com/34#entry34comment</comments>
      <pubDate>Mon, 27 Apr 2026 20:50:02 +0900</pubDate>
    </item>
    <item>
      <title>openpyxl 셀 색상, 폰트, 너비 설정하는 방법</title>
      <link>https://yjinstudy.tistory.com/33</link>
      <description>&lt;h1&gt;openpyxl 셀 색상, 폰트, 너비 설정하는 방법&lt;/h1&gt;

&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXudws/dJMcabDZxXj/HkEOK13JYzYH9pvDkpa0D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXudws/dJMcabDZxXj/HkEOK13JYzYH9pvDkpa0D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXudws/dJMcabDZxXj/HkEOK13JYzYH9pvDkpa0D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXudws%2FdJMcabDZxXj%2FHkEOK13JYzYH9pvDkpa0D0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;


&lt;p&gt;openpyxl 셀 스타일을 익혀두면 엑셀 자동화 결과를 훨씬 보기 좋게 만들 수 있습니다. 단순히 데이터를 넣는 것에서 끝나지 않고 제목 행 색상, 글자 폰트, 열 너비까지 자동으로 맞추면 실무에서 바로 쓸 수 있는 보고서 형태가 됩니다. 이번 글에서는 &lt;strong&gt;openpyxl 셀 스타일&lt;/strong&gt;을 이용해 &lt;strong&gt;셀 색상, 폰트, 열 너비&lt;/strong&gt;를 설정하는 방법을 예제와 함께 정리해보겠습니다.&lt;/p&gt;

&lt;h2&gt;왜 openpyxl 셀 스타일이 중요할까?&lt;/h2&gt;
&lt;p&gt;엑셀 자동화를 처음 할 때는 값만 잘 들어가면 된다고 생각하기 쉽습니다. 하지만 실제 업무에서는 보기 좋은 형식까지 맞춰야 다시 손으로 수정하는 일을 줄일 수 있습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;제목 행을 강조해서 가독성을 높일 수 있습니다.&lt;/li&gt;
  &lt;li&gt;열 너비를 자동으로 넓혀 데이터가 잘리지 않게 만들 수 있습니다.&lt;/li&gt;
  &lt;li&gt;폰트 크기와 굵기를 조정해 보고서 형태를 깔끔하게 맞출 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;예제 준비: openpyxl 설치&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pip install openpyxl&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;설치가 끝났다면 바로 아래 예제로 셀 스타일을 적용해볼 수 있습니다.&lt;/p&gt;

&lt;h2&gt;openpyxl로 셀 색상, 폰트, 너비 설정하기&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter

wb = Workbook()
ws = wb.active
ws.title = &quot;매출보고서&quot;

data = [
    [&quot;상품명&quot;, &quot;수량&quot;, &quot;금액&quot;],
    [&quot;키보드&quot;, 3, 90000],
    [&quot;마우스&quot;, 5, 75000],
    [&quot;모니터&quot;, 2, 400000],
]

for row in data:
    ws.append(row)

# 제목 행 스타일 적용
header_fill = PatternFill(fill_type=&quot;solid&quot;, fgColor=&quot;D9EAF7&quot;)
header_font = Font(name=&quot;맑은 고딕&quot;, bold=True, size=11)
header_alignment = Alignment(horizontal=&quot;center&quot;)

for cell in ws[1]:
    cell.fill = header_fill
    cell.font = header_font
    cell.alignment = header_alignment

# 데이터 영역 폰트 적용
for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
    for cell in row:
        cell.font = Font(name=&quot;맑은 고딕&quot;, size=10)

# 열 너비 자동 비슷하게 조정
for column_cells in ws.columns:
    max_length = 0
    column = column_cells[0].column
    column_letter = get_column_letter(column)

    for cell in column_cells:
        if cell.value:
            max_length = max(max_length, len(str(cell.value)))

    ws.column_dimensions[column_letter].width = max_length + 4

wb.save(&quot;styled_sales.xlsx&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;코드 설명&lt;/h2&gt;

&lt;h3&gt;1. 셀 색상 넣기&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;PatternFill&lt;/code&gt;은 셀 배경색을 지정할 때 사용합니다. 아래 코드처럼 제목 행에 연한 파란색을 넣으면 표 구조가 더 잘 보입니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;header_fill = PatternFill(fill_type=&quot;solid&quot;, fgColor=&quot;D9EAF7&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;여기서 &lt;code&gt;fgColor&lt;/code&gt;는 색상 코드입니다. 원하는 색으로 바꾸면 다른 느낌의 표도 쉽게 만들 수 있습니다.&lt;/p&gt;

&lt;h3&gt;2. 폰트 설정하기&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Font&lt;/code&gt;를 사용하면 글꼴, 굵기, 크기 등을 조정할 수 있습니다. 제목 행은 굵게, 본문은 일반 글씨로 나누면 보고서 형태가 훨씬 정리됩니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;header_font = Font(name=&quot;맑은 고딕&quot;, bold=True, size=11)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;실무에서는 보통 제목은 &lt;code&gt;bold=True&lt;/code&gt;로 강조하고, 데이터 행은 조금 작은 크기로 맞추는 경우가 많습니다.&lt;/p&gt;

&lt;h3&gt;3. 열 너비 설정하기&lt;/h3&gt;
&lt;p&gt;자동화로 엑셀을 만들면 가장 자주 생기는 문제가 셀 내용이 잘려 보이는 것입니다. 이럴 때 열 너비를 넉넉하게 잡아주면 바로 읽을 수 있는 파일이 됩니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ws.column_dimensions[&quot;A&quot;].width = 20&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;위처럼 직접 지정할 수도 있고, 이번 예제처럼 데이터 길이를 기준으로 비슷하게 자동 조정할 수도 있습니다.&lt;/p&gt;

&lt;h3&gt;4. 정렬까지 같이 맞추기&lt;/h3&gt;
&lt;p&gt;표 제목 행은 가운데 정렬을 자주 씁니다. &lt;code&gt;Alignment&lt;/code&gt;를 함께 적용하면 더 깔끔한 결과를 만들 수 있습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;header_alignment = Alignment(horizontal=&quot;center&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;실무에서 언제 많이 쓸까?&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;매출 보고서나 재고 목록을 매일 자동 생성할 때&lt;/li&gt;
  &lt;li&gt;팀원에게 바로 전달할 엑셀 파일을 꾸며야 할 때&lt;/li&gt;
  &lt;li&gt;CSV 데이터를 엑셀로 옮긴 뒤 보기 좋은 표로 정리할 때&lt;/li&gt;
  &lt;li&gt;여러 파일을 같은 양식으로 맞춰야 할 때&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;즉, 단순 저장이 아니라 “바로 전달 가능한 엑셀 결과물”이 필요할 때 openpyxl 셀 스타일이 유용합니다.&lt;/p&gt;

&lt;h2&gt;주의할 점&lt;/h2&gt;

&lt;h3&gt;색상 코드만 바꿔도 결과 느낌이 달라진다&lt;/h3&gt;
&lt;p&gt;배경색은 너무 진하면 오히려 가독성이 떨어질 수 있습니다. 제목 행은 연한 색 위주로 시작하는 것이 무난합니다.&lt;/p&gt;

&lt;h3&gt;폰트 이름은 환경에 따라 다를 수 있다&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;맑은 고딕&lt;/code&gt;처럼 시스템에 있는 폰트를 지정하면 보통 무난하지만, 환경에 따라 다르게 보일 수도 있습니다. 여러 PC에서 공유할 파일이라면 너무 특수한 글꼴은 피하는 편이 좋습니다.&lt;/p&gt;

&lt;h3&gt;열 너비 자동 조정은 완벽한 자동 맞춤이 아니다&lt;/h3&gt;
&lt;p&gt;엑셀 프로그램의 실제 자동 맞춤처럼 완전히 동일하게 동작하지는 않습니다. 한글과 숫자 길이가 섞인 경우에는 약간 넉넉하게 값을 주는 편이 안정적입니다.&lt;/p&gt;

&lt;h2&gt;조금 더 응용해보기&lt;/h2&gt;

&lt;h3&gt;제목 행 테두리까지 넣고 싶을 때&lt;/h3&gt;
&lt;p&gt;이번 글에서는 색상, 폰트, 너비 중심으로 설명했지만, 다음 단계에서는 테두리와 숫자 서식까지 함께 적용하면 더 완성도 높은 문서를 만들 수 있습니다.&lt;/p&gt;

&lt;h3&gt;특정 열만 따로 강조하고 싶을 때&lt;/h3&gt;
&lt;p&gt;예를 들어 금액 열만 굵게 처리하거나, 합계 행만 다른 배경색으로 넣는 식으로도 확장할 수 있습니다. 이런 방식은 월별 정산표나 매출 요약표에서 자주 쓰입니다.&lt;/p&gt;

&lt;h2&gt;FAQ&lt;/h2&gt;

&lt;h3&gt;Q1. openpyxl로 셀 배경색과 글자색을 같이 바꿀 수 있나요?&lt;/h3&gt;
&lt;p&gt;A. 가능합니다. &lt;code&gt;PatternFill&lt;/code&gt;로 배경색을, &lt;code&gt;Font&lt;/code&gt;로 글자색과 굵기 등을 함께 지정할 수 있습니다.&lt;/p&gt;

&lt;h3&gt;Q2. 열 너비를 자동으로 정확하게 맞출 수 있나요?&lt;/h3&gt;
&lt;p&gt;A. 완전히 엑셀의 자동 맞춤과 같지는 않지만, 문자열 길이를 기준으로 대부분 충분히 보기 좋게 맞출 수 있습니다.&lt;/p&gt;

&lt;h3&gt;Q3. 제목 행 말고 특정 셀만 따로 꾸밀 수도 있나요?&lt;/h3&gt;
&lt;p&gt;A. 가능합니다. 예를 들어 &lt;code&gt;ws[&quot;C2&quot;]&lt;/code&gt;처럼 특정 셀을 지정해서 개별 스타일을 적용할 수 있습니다.&lt;/p&gt;

&lt;h3&gt;Q4. openpyxl 셀 스타일은 기존 파일에도 적용할 수 있나요?&lt;/h3&gt;
&lt;p&gt;A. 가능합니다. &lt;code&gt;load_workbook()&lt;/code&gt;으로 기존 파일을 열고 필요한 셀에 스타일을 다시 지정한 뒤 저장하면 됩니다.&lt;/p&gt;

&lt;h2&gt;정리&lt;/h2&gt;
&lt;p&gt;openpyxl 셀 스타일을 익히면 단순히 엑셀 파일을 생성하는 수준에서 한 단계 더 나아갈 수 있습니다. 제목 행 배경색, 폰트, 열 너비만 자동으로 맞춰도 결과물이 훨씬 실무형 문서처럼 보입니다.&lt;/p&gt;

&lt;p&gt;특히 보고서, 재고표, 명단 파일처럼 다른 사람에게 바로 전달해야 하는 엑셀을 만든다면 스타일 자동화는 생각보다 큰 차이를 만듭니다. 먼저 제목 행 꾸미기부터 적용해보고, 익숙해지면 정렬과 숫자 서식까지 확장해보는 것을 추천합니다.&lt;/p&gt;

&lt;h2&gt;함께 보면 좋은 글&lt;/h2&gt;
&lt;p&gt;먼저 엑셀 파일을 새로 만들고 값을 넣는 기본 흐름이 필요하다면 &lt;a href=&quot;https://yjinstudy.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이썬 엑셀 자동화 방법&lt;/a&gt; 글과 함께 보면 이해가 더 쉽습니다.&lt;/p&gt;
&lt;p&gt;엑셀과 함께 자주 다루는 텍스트 데이터 흐름이 궁금하다면 &lt;a href=&quot;https://yjinstudy.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이썬 CSV 한글 깨짐 해결 방법&lt;/a&gt;도 이어서 읽어보면 좋습니다.&lt;/p&gt;
&lt;p&gt;파일 입출력 기본기가 아직 익숙하지 않다면 &lt;a href=&quot;https://yjinstudy.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이썬 파일 열어서 읽기&lt;/a&gt; 글도 같이 참고해보세요.&lt;/p&gt;</description>
      <category>coding</category>
      <category>openpyxl</category>
      <category>Python</category>
      <category>업무자동화</category>
      <category>엑셀서식</category>
      <category>엑셀자동화</category>
      <category>파이썬</category>
      <category>파이썬실무</category>
      <category>파이썬예제</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/33</guid>
      <comments>https://yjinstudy.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 26 Apr 2026 21:14:51 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 엑셀 자동화 시작하기: openpyxl로 파일 생성, 수정, 저장까지</title>
      <link>https://yjinstudy.tistory.com/32</link>
      <description>&lt;h1&gt;파이썬 엑셀 자동화 시작하기: openpyxl로 파일 생성, 수정, 저장까지&lt;/h1&gt;

&lt;p&gt;파이썬을 공부하다 보면 알고리즘 문제 풀이도 중요하지만, 실제로 자주 검색되는 주제는 따로 있습니다. 그중 하나가 바로 &lt;strong&gt;파이썬 엑셀 자동화&lt;/strong&gt;입니다. 회사나 학교에서 반복적으로 엑셀 파일을 정리해야 할 때 Python으로 자동화하면 시간을 크게 줄일 수 있습니다.&lt;/p&gt;

&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLKvus/dJMcajaUaPJ/CgMXIkj0JZ3hbhRkfpZdAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLKvus/dJMcajaUaPJ/CgMXIkj0JZ3hbhRkfpZdAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLKvus/dJMcajaUaPJ/CgMXIkj0JZ3hbhRkfpZdAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLKvus%2FdJMcajaUaPJ%2FCgMXIkj0JZ3hbhRkfpZdAK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;


&lt;p&gt;이번 글에서는 &lt;strong&gt;openpyxl&lt;/strong&gt; 라이브러리를 사용해서 엑셀 파일을 만들고, 데이터를 입력하고, 기존 파일을 수정한 뒤 저장하는 기본 방법까지 한 번에 정리해보겠습니다.&lt;/p&gt;

&lt;h2&gt;왜 파이썬 엑셀 자동화가 많이 검색될까?&lt;/h2&gt;
&lt;p&gt;엑셀은 거의 모든 직군에서 사용합니다. 그래서 &lt;strong&gt;파이썬 업무 자동화&lt;/strong&gt;, &lt;strong&gt;엑셀 자동화&lt;/strong&gt;, &lt;strong&gt;openpyxl 사용법&lt;/strong&gt; 같은 키워드는 입문자와 실무자 모두 자주 찾는 편입니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;매일 반복되는 보고서 정리 시간을 줄일 수 있음&lt;/li&gt;
  &lt;li&gt;엑셀 데이터를 자동으로 입력하거나 수정할 수 있음&lt;/li&gt;
  &lt;li&gt;파이썬 입문자가 실무 느낌을 내기 좋은 주제임&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;openpyxl이란?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;openpyxl&lt;/strong&gt;은 파이썬에서 엑셀 파일(&lt;code&gt;.xlsx&lt;/code&gt;)을 읽고 쓰는 데 많이 사용하는 라이브러리입니다. 새 파일을 만들 수도 있고, 기존 파일을 불러와서 값을 수정한 뒤 다시 저장할 수도 있습니다.&lt;/p&gt;

&lt;h2&gt;1. openpyxl 설치하기&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pip install openpyxl&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;설치가 끝났다면 아래처럼 import 해서 사용할 수 있습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from openpyxl import Workbook, load_workbook&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;2. 새 엑셀 파일 만들기&lt;/h2&gt;
&lt;p&gt;가장 먼저 해볼 것은 새로운 엑셀 파일 생성입니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = &quot;매출정리&quot;

ws[&quot;A1&quot;] = &quot;날짜&quot;
ws[&quot;B1&quot;] = &quot;상품명&quot;
ws[&quot;C1&quot;] = &quot;판매금액&quot;

ws[&quot;A2&quot;] = &quot;2026-04-25&quot;
ws[&quot;B2&quot;] = &quot;키보드&quot;
ws[&quot;C2&quot;] = 35000

wb.save(&quot;sales_report.xlsx&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;위 코드를 실행하면 &lt;code&gt;sales_report.xlsx&lt;/code&gt; 파일이 생성됩니다.&lt;/p&gt;

&lt;h2&gt;3. 반복문으로 여러 행 한 번에 입력하기&lt;/h2&gt;
&lt;p&gt;실제로는 한 줄씩 직접 입력하기보다 리스트나 반복문으로 여러 데이터를 넣는 경우가 많습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from openpyxl import Workbook

data = [
    [&quot;날짜&quot;, &quot;상품명&quot;, &quot;판매금액&quot;],
    [&quot;2026-04-25&quot;, &quot;키보드&quot;, 35000],
    [&quot;2026-04-25&quot;, &quot;마우스&quot;, 18000],
    [&quot;2026-04-25&quot;, &quot;모니터&quot;, 210000],
]

wb = Workbook()
ws = wb.active
ws.title = &quot;판매내역&quot;

for row in data:
    ws.append(row)

wb.save(&quot;product_list.xlsx&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;append()&lt;/code&gt;를 사용하면 행 단위로 데이터를 쉽게 추가할 수 있어서 실무에서 자주 사용합니다.&lt;/p&gt;

&lt;h2&gt;4. 기존 엑셀 파일 불러와서 수정하기&lt;/h2&gt;
&lt;p&gt;이미 존재하는 파일을 수정하려면 &lt;code&gt;load_workbook()&lt;/code&gt;을 사용하면 됩니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from openpyxl import load_workbook

wb = load_workbook(&quot;product_list.xlsx&quot;)
ws = wb[&quot;판매내역&quot;]

ws[&quot;D1&quot;] = &quot;비고&quot;
ws[&quot;D2&quot;] = &quot;주문완료&quot;
ws[&quot;D3&quot;] = &quot;배송준비&quot;
ws[&quot;D4&quot;] = &quot;출고완료&quot;

wb.save(&quot;product_list.xlsx&quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이렇게 하면 기존 파일에 새로운 열을 추가할 수 있습니다.&lt;/p&gt;

&lt;h2&gt;5. 셀 값 읽어오기&lt;/h2&gt;
&lt;p&gt;엑셀 자동화에서는 값을 입력하는 것만큼 읽어오는 것도 중요합니다.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from openpyxl import load_workbook

wb = load_workbook(&quot;product_list.xlsx&quot;)
ws = wb[&quot;판매내역&quot;]

print(ws[&quot;A2&quot;].value)
print(ws[&quot;B3&quot;].value)
print(ws[&quot;C4&quot;].value)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;출력 결과는 각 셀에 저장된 값입니다. 이 값을 활용하면 조건에 따라 다른 작업을 수행하는 자동화도 만들 수 있습니다.&lt;/p&gt;

&lt;h2&gt;6. 실무에서 자주 쓰는 예시&lt;/h2&gt;
&lt;p&gt;openpyxl은 아래 같은 작업에서 특히 유용합니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;매일 들어오는 주문 데이터를 한 파일로 정리하기&lt;/li&gt;
  &lt;li&gt;출석부, 가계부, 매출표 자동 생성하기&lt;/li&gt;
  &lt;li&gt;반복되는 보고서 양식에 값 채워 넣기&lt;/li&gt;
  &lt;li&gt;여러 엑셀 파일의 데이터를 읽어 한 번에 합치기&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;7. openpyxl 사용 시 주의할 점&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;save()&lt;/code&gt;를 호출하면 같은 파일명이 있을 때 덮어쓰기 될 수 있음&lt;/li&gt;
  &lt;li&gt;너무 큰 파일은 처리 속도가 느릴 수 있음&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;.xlsx&lt;/code&gt; 작업에 특히 많이 사용됨&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;정리&lt;/h2&gt;
&lt;p&gt;오늘은 &lt;strong&gt;파이썬 엑셀 자동화&lt;/strong&gt;의 가장 기본이 되는 &lt;strong&gt;openpyxl 사용법&lt;/strong&gt;을 정리해봤습니다. 새 파일 생성, 데이터 입력, 기존 파일 수정, 셀 값 읽기까지 익혀두면 이후에는 보고서 자동화나 업무 자동화로 확장하기 쉬워집니다.&lt;/p&gt;

&lt;p&gt;파이썬을 공부 중이라면 알고리즘 문제 풀이도 좋지만, 이렇게 &lt;strong&gt;실제로 바로 써먹을 수 있는 자동화 주제&lt;/strong&gt;를 함께 공부하면 검색 유입도 잘 잡히고 블로그 주제 확장에도 도움이 됩니다.&lt;/p&gt;

&lt;h2&gt;자주 묻는 질문&lt;/h2&gt;

&lt;h3&gt;Q. openpyxl은 엑셀이 컴퓨터에 설치되어 있어야 하나요?&lt;/h3&gt;
&lt;p&gt;아니요. 기본적인 읽기/쓰기 작업은 엑셀이 설치되어 있지 않아도 가능합니다.&lt;/p&gt;

&lt;h3&gt;Q. 파이썬 엑셀 자동화는 초보자도 가능한가요?&lt;/h3&gt;
&lt;p&gt;네. 반복문과 리스트 정도만 알아도 기본 자동화는 충분히 시작할 수 있습니다.&lt;/p&gt;

&lt;h3&gt;Q. 어떤 사람이 이 주제를 가장 많이 찾나요?&lt;/h3&gt;
&lt;p&gt;사무직, 대학생, 데이터 정리 업무가 많은 사람, 그리고 파이썬 입문자가 많이 검색하는 편입니다.&lt;/p&gt;

&lt;p&gt;다음 글에서는 &lt;strong&gt;openpyxl로 셀 색상, 너비, 폰트까지 자동으로 꾸미는 방법&lt;/strong&gt;도 정리해보겠습니다.&lt;/p&gt;</description>
      <category>coding</category>
      <category>openpyxl</category>
      <category>Python</category>
      <category>업무자동화</category>
      <category>엑셀자동화</category>
      <category>엑셀파일수정</category>
      <category>티스토리SEO</category>
      <category>파이썬</category>
      <category>파이썬실무</category>
      <category>파이썬예제</category>
      <category>파이썬입문</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/32</guid>
      <comments>https://yjinstudy.tistory.com/32#entry32comment</comments>
      <pubDate>Sat, 25 Apr 2026 12:12:52 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 CSV 한글 깨짐 해결 방법 | UnicodeDecodeError, cp949, utf-8 한 번에 정리</title>
      <link>https://yjinstudy.tistory.com/31</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬 CSV 한글 깨짐 해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬으로 CSV 파일을 읽다가 한글이 깨지거나 &lt;b&gt;UnicodeDecodeError&lt;/b&gt;가 뜨면 정말 당황스럽죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 처음에는 왜 파일은 멀쩡한데 파이썬에서만 오류가 나는지 헷갈렸는데, 알고 보면 대부분 &lt;b&gt;인코딩 방식이 맞지 않아서&lt;/b&gt; 생기는 문제였어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;파이썬 CSV 한글 깨짐&lt;/b&gt;, &lt;b&gt;UnicodeDecodeError 해결&lt;/b&gt;, 그리고 &lt;b&gt;cp949 / utf-8 차이&lt;/b&gt;까지 한 번에 정리해볼게요.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-5968522348802254&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 이런 오류가 생길까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSV 파일은 겉으로 보기에는 그냥 텍스트 파일이지만, 실제로는 어떤 방식으로 문자를 저장했는지가 중요해요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;utf-8&lt;/b&gt;: 웹이나 개발 환경에서 가장 많이 사용하는 인코딩&lt;/li&gt;
&lt;li&gt;&lt;b&gt;cp949&lt;/b&gt;: 윈도우 환경, 특히 한글 CSV에서 자주 나오는 인코딩&lt;/li&gt;
&lt;li&gt;&lt;b&gt;euc-kr&lt;/b&gt;: 예전 한글 문서에서 종종 보이는 인코딩&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 파일은 &lt;b&gt;cp949&lt;/b&gt;로 저장되어 있는데 파이썬에서 &lt;b&gt;utf-8&lt;/b&gt;로 읽으려고 하면 오류가 납니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표적인 오류 메시지&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;UnicodeDecodeError: 'utf-8' codec can't decode byte ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 에러는 보통 &lt;b&gt;utf-8이 아닌 파일을 utf-8로 읽었을 때&lt;/b&gt; 발생합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 먼저 해볼 해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pandas&lt;/b&gt;로 CSV를 읽는다면 &lt;code&gt;encoding&lt;/code&gt; 옵션을 직접 넣어보세요.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(&quot;data.csv&quot;, encoding=&quot;cp949&quot;)
print(df.head())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이 방법으로 잘 열리면 파일이 &lt;b&gt;cp949&lt;/b&gt; 계열이었다는 뜻입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;utf-8 파일이라면?&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(&quot;data.csv&quot;, encoding=&quot;utf-8&quot;)
print(df.head())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간혹 UTF-8 BOM 때문에 문제가 생기는 경우도 있어서 이럴 때는 아래처럼 해보면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(&quot;data.csv&quot;, encoding=&quot;utf-8-sig&quot;)
print(df.head())&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;open()으로 파일을 읽을 때도 똑같아요&lt;/h3&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;with open(&quot;data.csv&quot;, &quot;r&quot;, encoding=&quot;cp949&quot;) as f:
    text = f.read()
    print(text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;read_csv()&lt;/code&gt;든 &lt;code&gt;open()&lt;/code&gt;이든 핵심은 같습니다. &lt;b&gt;파일의 실제 인코딩과 코드에서 지정한 인코딩을 맞추는 것&lt;/b&gt;이에요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cp949와 utf-8 중 뭘 쓰면 될까?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엑셀에서 저장한 한글 CSV: &lt;b&gt;cp949&lt;/b&gt; 먼저 시도&lt;/li&gt;
&lt;li&gt;웹에서 내려받은 데이터나 개발용 파일: &lt;b&gt;utf-8&lt;/b&gt; 먼저 시도&lt;/li&gt;
&lt;li&gt;UTF-8인데도 이상하면: &lt;b&gt;utf-8-sig&lt;/b&gt; 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실전에서 가장 많이 쓰는 코드&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import pandas as pd

try:
    df = pd.read_csv(&quot;data.csv&quot;, encoding=&quot;utf-8&quot;)
except UnicodeDecodeError:
    df = pd.read_csv(&quot;data.csv&quot;, encoding=&quot;cp949&quot;)

print(df.head())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성하면 utf-8로 먼저 읽고, 안 되면 cp949로 다시 읽을 수 있어서 실무에서도 꽤 편리해요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한글이 깨질 때 체크할 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일을 어느 프로그램에서 저장했는지 확인하기&lt;/li&gt;
&lt;li&gt;엑셀 저장 파일이면 cp949 가능성 먼저 보기&lt;/li&gt;
&lt;li&gt;웹/개발 도구에서 만든 파일이면 utf-8 확인하기&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utf-8-sig&lt;/code&gt;도 같이 테스트해보기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파이썬 CSV 한글 깨짐&lt;/b&gt; 문제는 대부분 인코딩 mismatch 때문에 생깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 많이 쓰는 해결 순서는 아래처럼 생각하면 편해요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;utf-8&lt;/code&gt;로 시도한다&lt;/li&gt;
&lt;li&gt;안 되면 &lt;code&gt;cp949&lt;/code&gt;로 시도한다&lt;/li&gt;
&lt;li&gt;그래도 이상하면 &lt;code&gt;utf-8-sig&lt;/code&gt;를 확인한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저처럼 처음에 인코딩 때문에 시간을 많이 쓰는 분들께 도움이 되었으면 좋겠어요. 다음에는 &lt;b&gt;pandas read_csv 자주 나는 오류&lt;/b&gt;도 정리해보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함께 보면 좋은 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 문자열, 인코딩, 파일 입출력을 같이 이해해두면 이런 오류를 훨씬 빨리 해결할 수 있어요.&lt;/p&gt;</description>
      <category>coding</category>
      <category>cp949</category>
      <category>csv한글깨짐</category>
      <category>pandas</category>
      <category>Python</category>
      <category>read_csv</category>
      <category>unicodedecodeerror</category>
      <category>UTF8</category>
      <category>인코딩오류</category>
      <category>파이썬</category>
      <category>파이썬오류해결</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/31</guid>
      <comments>https://yjinstudy.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 24 Apr 2026 23:13:42 +0900</pubDate>
    </item>
    <item>
      <title>2026 SQLD 독학 로드맵: 비전공자도 시작할 수 있는 SQL 공부 순서</title>
      <link>https://yjinstudy.tistory.com/30</link>
      <description>&lt;h1&gt;2026 SQLD 독학 로드맵: 비전공자도 시작할 수 있는 SQL 공부 순서&lt;/h1&gt;

&lt;p&gt;
안녕하세요. 오늘은 코딩 공부를 하면서 꼭 한 번쯤 마주치게 되는
&lt;strong&gt;SQLD 자격증&lt;/strong&gt;과 &lt;strong&gt;SQL 독학 방법&lt;/strong&gt;에 대해 정리해보려고 합니다.
&lt;/p&gt;

&lt;p&gt;
저도 처음에는 파이썬이나 백준 문제처럼 코드만 열심히 풀면 된다고 생각했는데,
데이터를 다루는 일을 하려면 SQL을 피하기 어렵다는 걸 알게 되었습니다.
특히 개발자 취업, 데이터 분석, 기획 직무를 준비한다면 SQLD는 입문용 자격증으로 많이 언급됩니다.
&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;1. SQLD는 어떤 사람에게 필요할까?&lt;/h2&gt;

&lt;p&gt;
SQLD는 SQL Developer의 줄임말로, 데이터베이스와 SQL 활용 능력을 확인하는 자격증입니다.
개발자만 보는 시험이라기보다는 데이터 분석가, 기획자, 마케터, 취업 준비생도 많이 준비합니다.
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;비전공자인데 데이터 직무를 준비하는 사람&lt;/li&gt;
  &lt;li&gt;SQL을 배웠지만 실력을 증명할 자격증이 필요한 사람&lt;/li&gt;
  &lt;li&gt;정보처리기사 실기나 코딩 테스트와 함께 SQL을 공부하려는 사람&lt;/li&gt;
  &lt;li&gt;파이썬 데이터 분석을 시작하기 전에 데이터베이스 기초를 잡고 싶은 사람&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
특히 요즘은 파이썬만 할 줄 아는 것보다,
&lt;strong&gt;파이썬 + SQL&lt;/strong&gt; 조합을 갖추는 것이 훨씬 실무적으로 좋다고 느꼈습니다.
&lt;/p&gt;

&lt;h2&gt;2. SQLD를 독학하기 전에 알아야 할 것&lt;/h2&gt;

&lt;p&gt;
SQLD 공부를 시작하기 전에 가장 먼저 알아야 할 점은,
이 시험이 단순히 SQL 문법만 외우는 시험은 아니라는 것입니다.
&lt;/p&gt;

&lt;p&gt;
크게 보면 다음 두 가지를 공부하게 됩니다.
&lt;/p&gt;

&lt;table border=&quot;1&quot; cellpadding=&quot;8&quot; cellspacing=&quot;0&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;구분&lt;/th&gt;
      &lt;th&gt;공부 내용&lt;/th&gt;
      &lt;th&gt;난이도&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;데이터 모델링&lt;/td&gt;
      &lt;td&gt;엔터티, 속성, 관계, 정규화&lt;/td&gt;
      &lt;td&gt;처음에는 낯설지만 암기 비중이 있음&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;SQL 기본 및 활용&lt;/td&gt;
      &lt;td&gt;SELECT, JOIN, GROUP BY, 서브쿼리, 함수&lt;/td&gt;
      &lt;td&gt;직접 쿼리를 많이 써봐야 함&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
개인적으로는 데이터 모델링보다 SQL 쿼리 부분이 더 중요하다고 생각합니다.
시험 합격도 중요하지만, 실제로 남는 공부는 결국 쿼리를 직접 작성해보는 과정이기 때문입니다.
&lt;/p&gt;

&lt;h2&gt;3. 비전공자 기준 SQLD 공부 순서&lt;/h2&gt;

&lt;h3&gt;1단계: SELECT 문부터 익숙해지기&lt;/h3&gt;

&lt;p&gt;
처음부터 JOIN이나 서브쿼리를 공부하면 어렵게 느껴질 수 있습니다.
가장 먼저 SELECT 문 구조부터 익숙해지는 것이 좋습니다.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT 컬럼명
FROM 테이블명
WHERE 조건;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
예를 들어 학생 테이블에서 점수가 80점 이상인 학생만 조회한다고 하면 다음과 같이 쓸 수 있습니다.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT name, score
FROM student
WHERE score &amp;gt;= 80;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
이 단계에서는 문법을 외우기보다,
&lt;strong&gt;어떤 데이터를 어떤 조건으로 가져오는지&lt;/strong&gt;를 이해하는 것이 중요합니다.
&lt;/p&gt;

&lt;h3&gt;2단계: GROUP BY와 집계 함수 익히기&lt;/h3&gt;

&lt;p&gt;
SQLD에서 자주 나오는 부분 중 하나가 GROUP BY입니다.
처음에는 헷갈리지만, “묶어서 계산한다”라고 생각하면 조금 쉬워집니다.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT department, COUNT(*) AS count
FROM employee
GROUP BY department;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
위 쿼리는 부서별 직원 수를 구하는 예시입니다.
COUNT, SUM, AVG, MAX, MIN 같은 집계 함수와 함께 자주 사용됩니다.
&lt;/p&gt;

&lt;h3&gt;3단계: JOIN 이해하기&lt;/h3&gt;

&lt;p&gt;
SQL을 공부할 때 가장 중요한 부분 중 하나가 JOIN입니다.
실무에서도 하나의 테이블만 보는 경우보다 여러 테이블을 연결해서 보는 경우가 많습니다.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT s.name, c.course_name
FROM student s
JOIN course c
ON s.course_id = c.course_id;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
JOIN은 처음에는 어렵지만, 테이블 두 개를 공통된 컬럼으로 연결한다고 생각하면 됩니다.
SQLD를 준비한다면 INNER JOIN, LEFT OUTER JOIN의 차이는 꼭 이해해야 합니다.
&lt;/p&gt;

&lt;h3&gt;4단계: 서브쿼리 연습하기&lt;/h3&gt;

&lt;p&gt;
서브쿼리는 쿼리 안에 또 다른 쿼리가 들어가는 형태입니다.
SQLD 문제에서 헷갈리기 쉬운 부분이기 때문에 예제를 많이 보는 것이 좋습니다.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT name, score
FROM student
WHERE score &amp;gt; (
  SELECT AVG(score)
  FROM student
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
위 쿼리는 평균 점수보다 높은 학생을 조회하는 예시입니다.
처음에는 복잡해 보이지만, 안쪽 쿼리부터 실행된다고 생각하면 이해하기 쉽습니다.
&lt;/p&gt;

&lt;h2&gt;4. SQLD 독학 기간은 얼마나 잡아야 할까?&lt;/h2&gt;

&lt;p&gt;
비전공자 기준으로는 보통 4주에서 8주 정도를 잡는 것이 현실적이라고 생각합니다.
물론 하루에 공부할 수 있는 시간에 따라 차이가 있습니다.
&lt;/p&gt;

&lt;table border=&quot;1&quot; cellpadding=&quot;8&quot; cellspacing=&quot;0&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;공부 가능 시간&lt;/th&gt;
      &lt;th&gt;추천 기간&lt;/th&gt;
      &lt;th&gt;공부 방식&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;하루 1시간&lt;/td&gt;
      &lt;td&gt;약 8주&lt;/td&gt;
      &lt;td&gt;개념 + 기출 반복&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;하루 2시간&lt;/td&gt;
      &lt;td&gt;약 4~6주&lt;/td&gt;
      &lt;td&gt;SQL 실습 중심&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;주말 집중&lt;/td&gt;
      &lt;td&gt;약 6~8주&lt;/td&gt;
      &lt;td&gt;평일 암기, 주말 문제풀이&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
단기간 합격만 목표라면 기출문제 위주로 공부할 수도 있지만,
나중에 데이터 분석이나 개발 공부까지 이어가려면 SQL 문법을 직접 작성해보는 시간을 꼭 넣는 것이 좋습니다.
&lt;/p&gt;

&lt;h2&gt;5. SQLD 공부할 때 많이 하는 실수&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;SQL 문법을 눈으로만 보고 직접 작성하지 않는다.&lt;/li&gt;
  &lt;li&gt;JOIN을 정확히 이해하지 않고 문제만 외운다.&lt;/li&gt;
  &lt;li&gt;데이터 모델링 용어를 시험 직전에 몰아서 외운다.&lt;/li&gt;
  &lt;li&gt;오답노트를 만들지 않고 같은 문제를 반복해서 틀린다.&lt;/li&gt;
  &lt;li&gt;SELECT 실행 순서를 이해하지 않고 문법만 암기한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
SQL은 파이썬처럼 직접 실행해보면 훨씬 빨리 늘어납니다.
가능하면 SQLite, MySQL, PostgreSQL 중 하나를 설치해서 예제 테이블을 만들어보는 것을 추천합니다.
&lt;/p&gt;

&lt;h2&gt;6. SQLD와 함께 공부하면 좋은 것&lt;/h2&gt;

&lt;p&gt;
SQLD만 공부해도 좋지만, 블로그나 포트폴리오까지 생각한다면 아래 주제와 함께 공부하면 좋습니다.
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;파이썬 pandas로 CSV 파일 분석하기&lt;/li&gt;
  &lt;li&gt;SQL 쿼리 결과를 파이썬으로 불러오기&lt;/li&gt;
  &lt;li&gt;정보처리기사 실기 SQL 문제 정리&lt;/li&gt;
  &lt;li&gt;백준 SQL 문제 풀이&lt;/li&gt;
  &lt;li&gt;데이터 분석 포트폴리오 만들기&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
특히 이 블로그처럼 코딩 공부 기록을 남기는 경우라면,
SQLD 공부 과정도 글로 정리해두면 나중에 복습하기 좋고 검색 유입도 기대할 수 있습니다.
&lt;/p&gt;

&lt;h2&gt;7. 추천 공부 루틴&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;1주차: SELECT, WHERE, ORDER BY, GROUP BY 기본 문법 익히기&lt;/li&gt;
  &lt;li&gt;2주차: JOIN, 서브쿼리, 집계 함수 문제 풀기&lt;/li&gt;
  &lt;li&gt;3주차: 데이터 모델링 개념 정리하기&lt;/li&gt;
  &lt;li&gt;4주차: 기출문제 풀이와 오답노트 작성하기&lt;/li&gt;
  &lt;li&gt;시험 전: 자주 틀리는 SQL 문법과 모델링 용어만 반복하기&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
저는 SQLD를 준비한다면 처음부터 완벽하게 외우려고 하기보다,
문제를 풀면서 모르는 개념을 다시 정리하는 방식이 더 효율적이라고 생각합니다.
&lt;/p&gt;

&lt;h2&gt;마무리&lt;/h2&gt;

&lt;p&gt;
SQLD는 엄청 어려운 자격증이라기보다는,
데이터 공부를 시작하는 사람에게 좋은 기준점이 되는 자격증이라고 생각합니다.
&lt;/p&gt;

&lt;p&gt;
파이썬을 공부하고 있거나, 코딩 테스트를 준비하고 있거나,
데이터 분석 쪽으로 진로를 고민하고 있다면 SQLD 공부를 한 번쯤 해보는 것을 추천합니다.
&lt;/p&gt;

&lt;p&gt;
다음 글에서는 SQLD에서 자주 나오는
&lt;strong&gt;SELECT 실행 순서와 GROUP BY 문제&lt;/strong&gt;를 예제로 정리해보겠습니다.
&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;한눈에 정리&lt;/h2&gt;

&lt;p&gt;
2026년에 SQLD 독학을 준비한다면 먼저 SELECT, WHERE, GROUP BY, JOIN, 서브쿼리 순서로 SQL 기본기를 잡는 것이 좋습니다.
비전공자라면 4주에서 8주 정도의 기간을 잡고, 개념 정리와 기출문제 풀이를 함께 반복하는 방식이 가장 현실적입니다.
&lt;/p&gt;</description>
      <category>coding</category>
      <category>SQL</category>
      <category>sqld</category>
      <category>sql독학</category>
      <category>데이터분석</category>
      <category>데이터취업</category>
      <category>비전공자개발자</category>
      <category>자격증공부</category>
      <category>정보처리기사</category>
      <category>코딩공부</category>
      <category>파이썬</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/30</guid>
      <comments>https://yjinstudy.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 23 Apr 2026 20:18:00 +0900</pubDate>
    </item>
    <item>
      <title>맥북 처음 쓰는 개발자를 위한 세팅 가이드</title>
      <link>https://yjinstudy.tistory.com/29</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot; /&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;/&gt;
  &lt;title&gt;맥북 처음 쓰는 개발자를 위한 세팅 가이드&lt;/title&gt;
  &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700;900&amp;family=JetBrains+Mono:wght@400;700&amp;display=swap&quot; rel=&quot;stylesheet&quot;/&gt;
  &lt;style&gt;
    :root {
      --bg: #0f0f10;
      --surface: #1a1a1e;
      --surface2: #242428;
      --border: #2e2e34;
      --accent: #00e5a0;
      --accent2: #4f9eff;
      --accent3: #ff6b6b;
      --text: #e8e8ec;
      --text-muted: #8888a0;
      --code-bg: #141418;
    }

    * { box-sizing: border-box; margin: 0; padding: 0; }

    body {
      background: var(--bg);
      color: var(--text);
      font-family: 'Noto Sans KR', sans-serif;
      font-size: 16px;
      line-height: 1.8;
      padding: 0 16px;
    }

    .container {
      max-width: 780px;
      margin: 0 auto;
      padding: 60px 0 120px;
    }

    /* ── 헤더 ── */
    .hero {
      background: linear-gradient(135deg, #1a1a1e 0%, #0f1a2e 100%);
      border: 1px solid var(--border);
      border-radius: 20px;
      padding: 48px 40px;
      margin-bottom: 48px;
      position: relative;
      overflow: hidden;
    }
    .hero::before {
      content: '';
      position: absolute;
      top: -80px; right: -80px;
      width: 260px; height: 260px;
      background: radial-gradient(circle, rgba(0,229,160,0.12) 0%, transparent 70%);
      pointer-events: none;
    }
    .hero-badge {
      display: inline-block;
      background: rgba(0,229,160,0.12);
      color: var(--accent);
      border: 1px solid rgba(0,229,160,0.3);
      border-radius: 20px;
      padding: 4px 14px;
      font-size: 12px;
      font-weight: 700;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      margin-bottom: 20px;
    }
    .hero h1 {
      font-size: clamp(26px, 5vw, 38px);
      font-weight: 900;
      line-height: 1.25;
      margin-bottom: 16px;
      letter-spacing: -0.02em;
    }
    .hero h1 span { color: var(--accent); }
    .hero-desc {
      color: var(--text-muted);
      font-size: 15px;
      max-width: 520px;
    }
    .hero-meta {
      margin-top: 28px;
      display: flex;
      gap: 20px;
      flex-wrap: wrap;
    }
    .hero-meta span {
      font-size: 13px;
      color: var(--text-muted);
    }
    .hero-meta strong { color: var(--accent2); }

    /* ── TOC ── */
    .toc {
      background: var(--surface);
      border: 1px solid var(--border);
      border-left: 3px solid var(--accent);
      border-radius: 12px;
      padding: 28px 32px;
      margin-bottom: 48px;
    }
    .toc-title {
      font-size: 13px;
      font-weight: 700;
      color: var(--accent);
      letter-spacing: 0.1em;
      text-transform: uppercase;
      margin-bottom: 16px;
    }
    .toc ol {
      padding-left: 20px;
    }
    .toc li {
      margin-bottom: 6px;
      font-size: 14px;
    }
    .toc a {
      color: var(--text-muted);
      text-decoration: none;
      transition: color 0.2s;
    }
    .toc a:hover { color: var(--accent); }

    /* ── 섹션 ── */
    .section {
      margin-bottom: 56px;
    }
    .section-header {
      display: flex;
      align-items: center;
      gap: 14px;
      margin-bottom: 24px;
      padding-bottom: 16px;
      border-bottom: 1px solid var(--border);
    }
    .section-num {
      width: 36px; height: 36px;
      background: var(--accent);
      color: #000;
      border-radius: 10px;
      display: flex; align-items: center; justify-content: center;
      font-size: 14px; font-weight: 900;
      font-family: 'JetBrains Mono', monospace;
      flex-shrink: 0;
    }
    .section-title {
      font-size: 22px;
      font-weight: 800;
      letter-spacing: -0.02em;
    }

    p { margin-bottom: 16px; color: #c8c8d8; }

    /* ── 코드 블록 ── */
    .code-block {
      background: var(--code-bg);
      border: 1px solid var(--border);
      border-radius: 10px;
      margin: 20px 0;
      overflow: hidden;
    }
    .code-header {
      background: var(--surface2);
      border-bottom: 1px solid var(--border);
      padding: 10px 16px;
      display: flex;
      align-items: center;
      gap: 8px;
    }
    .code-dot {
      width: 10px; height: 10px;
      border-radius: 50%;
    }
    .code-dot:nth-child(1) { background: #ff5f57; }
    .code-dot:nth-child(2) { background: #febc2e; }
    .code-dot:nth-child(3) { background: #28c840; }
    .code-label {
      margin-left: auto;
      font-size: 11px;
      color: var(--text-muted);
      font-family: 'JetBrains Mono', monospace;
    }
    .code-block pre {
      padding: 20px;
      font-family: 'JetBrains Mono', monospace;
      font-size: 13px;
      line-height: 1.7;
      overflow-x: auto;
      color: #c9d1d9;
    }
    .code-block pre .cmd { color: var(--accent); }
    .code-block pre .comment { color: #6a737d; }
    .code-block pre .str { color: #a5d6ff; }

    /* ── 카드 그리드 ── */
    .card-grid {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
      gap: 16px;
      margin: 20px 0;
    }
    .card {
      background: var(--surface);
      border: 1px solid var(--border);
      border-radius: 12px;
      padding: 20px;
      transition: border-color 0.2s, transform 0.2s;
    }
    .card:hover {
      border-color: var(--accent);
      transform: translateY(-2px);
    }
    .card-icon { font-size: 26px; margin-bottom: 10px; }
    .card-name {
      font-size: 15px;
      font-weight: 700;
      margin-bottom: 6px;
      color: var(--text);
    }
    .card-desc { font-size: 13px; color: var(--text-muted); line-height: 1.5; margin: 0; }
    .card-tag {
      display: inline-block;
      margin-top: 10px;
      font-size: 11px;
      padding: 2px 8px;
      border-radius: 6px;
      font-weight: 700;
    }
    .tag-free { background: rgba(0,229,160,0.15); color: var(--accent); }
    .tag-pay  { background: rgba(255,107,107,0.15); color: var(--accent3); }
    .tag-both { background: rgba(79,158,255,0.15); color: var(--accent2); }

    /* ── 팁 박스 ── */
    .tip {
      border-radius: 10px;
      padding: 18px 22px;
      margin: 20px 0;
      display: flex;
      gap: 14px;
      align-items: flex-start;
    }
    .tip-green { background: rgba(0,229,160,0.08); border: 1px solid rgba(0,229,160,0.2); }
    .tip-blue  { background: rgba(79,158,255,0.08); border: 1px solid rgba(79,158,255,0.2); }
    .tip-red   { background: rgba(255,107,107,0.08); border: 1px solid rgba(255,107,107,0.2); }
    .tip-icon { font-size: 20px; flex-shrink: 0; margin-top: 2px; }
    .tip-body { font-size: 14px; color: var(--text-muted); line-height: 1.7; margin: 0; }
    .tip-body strong { color: var(--text); }

    /* ── 단계 리스트 ── */
    .step-list { list-style: none; padding: 0; }
    .step-list li {
      display: flex;
      gap: 16px;
      align-items: flex-start;
      padding: 16px 0;
      border-bottom: 1px solid var(--border);
    }
    .step-list li:last-child { border-bottom: none; }
    .step-badge {
      min-width: 28px; height: 28px;
      background: var(--surface2);
      border: 1px solid var(--border);
      border-radius: 8px;
      display: flex; align-items: center; justify-content: center;
      font-family: 'JetBrains Mono', monospace;
      font-size: 12px; font-weight: 700;
      color: var(--accent2);
      flex-shrink: 0;
      margin-top: 2px;
    }
    .step-content { font-size: 14px; color: #c8c8d8; line-height: 1.7; }
    .step-content strong { color: var(--text); font-size: 15px; display: block; margin-bottom: 4px; }

    /* ── 키 단축키 ── */
    kbd {
      background: var(--surface2);
      border: 1px solid var(--border);
      border-bottom: 2px solid var(--border);
      border-radius: 5px;
      padding: 2px 8px;
      font-family: 'JetBrains Mono', monospace;
      font-size: 12px;
      color: var(--accent2);
    }

    /* ── 표 ── */
    .table-wrap { overflow-x: auto; margin: 20px 0; }
    table { width: 100%; border-collapse: collapse; font-size: 14px; }
    th {
      background: var(--surface2);
      color: var(--text-muted);
      font-size: 12px;
      font-weight: 700;
      text-transform: uppercase;
      letter-spacing: 0.06em;
      padding: 12px 16px;
      text-align: left;
      border-bottom: 1px solid var(--border);
    }
    td {
      padding: 12px 16px;
      border-bottom: 1px solid var(--border);
      color: #c8c8d8;
      vertical-align: top;
    }
    tr:last-child td { border-bottom: none; }
    tr:hover td { background: rgba(255,255,255,0.02); }

    /* ── 마무리 ── */
    .outro {
      background: linear-gradient(135deg, #0f1a2e 0%, #1a1a1e 100%);
      border: 1px solid var(--border);
      border-radius: 20px;
      padding: 40px;
      text-align: center;
      margin-top: 60px;
    }
    .outro h2 { font-size: 22px; font-weight: 800; margin-bottom: 12px; }
    .outro p { color: var(--text-muted); font-size: 14px; margin: 0; }

    /* inline code */
    code {
      font-family: 'JetBrains Mono', monospace;
      background: var(--surface2);
      border: 1px solid var(--border);
      border-radius: 4px;
      padding: 1px 6px;
      font-size: 13px;
      color: var(--accent2);
    }

    h3 {
      font-size: 17px;
      font-weight: 700;
      margin: 28px 0 12px;
      color: var(--text);
    }

    @media (max-width: 600px) {
      .hero { padding: 32px 24px; }
      .toc { padding: 22px 20px; }
      .card-grid { grid-template-columns: 1fr 1fr; }
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;container&quot;&gt;

  &lt;!-- 헤더 --&gt;
  &lt;div class=&quot;hero&quot;&gt;
    &lt;div class=&quot;hero-badge&quot;&gt;  macOS Setup Guide&lt;/div&gt;
    &lt;h1&gt;맥북 처음 쓰는 개발자를 위한&lt;br&gt;&lt;span&gt;완벽 세팅 가이드&lt;/span&gt;&lt;/h1&gt;
    &lt;p class=&quot;hero-desc&quot;&gt;Homebrew부터 터미널 커스터마이징, VS Code, Git까지 — 개발 환경을 처음부터 끝까지 한 번에 잡아보세요.&lt;/p&gt;
    &lt;div class=&quot;hero-meta&quot;&gt;
      &lt;span&gt;⏱ 읽는 시간 약 &lt;strong&gt;10분&lt;/strong&gt;&lt;/span&gt;
      &lt;span&gt;  대상: &lt;strong&gt;맥북 입문 개발자&lt;/strong&gt;&lt;/span&gt;
      &lt;span&gt;  &lt;strong&gt;2025년&lt;/strong&gt; 기준&lt;/span&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 목차 --&gt;
  &lt;div class=&quot;toc&quot;&gt;
    &lt;div class=&quot;toc-title&quot;&gt;  목차&lt;/div&gt;
    &lt;ol&gt;
      &lt;li&gt;&lt;a href=&quot;#step1&quot;&gt;맥북 구매 후 가장 먼저 할 설정&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step2&quot;&gt;Homebrew 설치 — 맥의 필수 패키지 매니저&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step3&quot;&gt;터미널 업그레이드 — iTerm2 + Oh My Zsh&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step4&quot;&gt;Git 설정&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step5&quot;&gt;VS Code 설치 &amp; 추천 익스텐션&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step6&quot;&gt;개발 언어별 환경 설정 (Python / Node.js / Java)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step7&quot;&gt;개발자 필수 앱 추천&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step8&quot;&gt;맥북 꿀팁 단축키 모음&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/div&gt;

  &lt;!-- 1. 초기 설정 --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step1&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;01&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;맥북 구매 후 가장 먼저 할 설정&lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;처음 맥북을 켜면 설정해야 할 것들이 많아 막막할 수 있어요. 개발 환경을 쾌적하게 만들기 위해 아래 순서대로 진행해보세요.&lt;/p&gt;

    &lt;ul class=&quot;step-list&quot;&gt;
      &lt;li&gt;
        &lt;div class=&quot;step-badge&quot;&gt;1&lt;/div&gt;
        &lt;div class=&quot;step-content&quot;&gt;
          &lt;strong&gt;macOS 최신 버전으로 업데이트&lt;/strong&gt;
          시스템 환경설정 → 소프트웨어 업데이트에서 최신 버전으로 올려줍니다. 보안 패치와 성능 개선이 포함되어 있어요.
        &lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;step-badge&quot;&gt;2&lt;/div&gt;
        &lt;div class=&quot;step-content&quot;&gt;
          &lt;strong&gt;Xcode Command Line Tools 설치&lt;/strong&gt;
          터미널을 열고 아래 명령어를 실행하세요. Homebrew를 비롯한 대부분의 개발 도구가 이걸 필요로 해요.
        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Terminal&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;cmd&quot;&gt;xcode-select --install&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;ul class=&quot;step-list&quot;&gt;
      &lt;li&gt;
        &lt;div class=&quot;step-badge&quot;&gt;3&lt;/div&gt;
        &lt;div class=&quot;step-content&quot;&gt;
          &lt;strong&gt;트랙패드 &amp; 키보드 설정 최적화&lt;/strong&gt;
          시스템 설정 → 트랙패드에서 &lt;strong&gt;탭하여 클릭&lt;/strong&gt;을 켜고, 스크롤 방향은 취향에 맞게 조정하세요. 키보드는 키 반복 속도를 최대로 올려두면 코딩할 때 훨씬 편해요.
        &lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;step-badge&quot;&gt;4&lt;/div&gt;
        &lt;div class=&quot;step-content&quot;&gt;
          &lt;strong&gt;파일 확장자 &amp; 숨김 파일 표시&lt;/strong&gt;
          Finder에서 &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;.&lt;/kbd&gt; 을 누르면 숨김 파일이 보여요. 개발할 때 &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.gitignore&lt;/code&gt; 같은 숨김 파일을 자주 확인하게 됩니다.
        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;tip tip-blue&quot;&gt;
      &lt;div class=&quot;tip-icon&quot;&gt; &lt;/div&gt;
      &lt;div class=&quot;tip-body&quot;&gt;&lt;strong&gt;Finder 설정 꿀팁:&lt;/strong&gt; Finder 환경설정 → 고급에서 &lt;strong&gt;&quot;모든 파일 확장자 보기&quot;&lt;/strong&gt;를 체크해두세요. 파일 종류를 한눈에 구별하기 훨씬 쉬워집니다.&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 2. Homebrew --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step2&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;02&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;Homebrew 설치 — 맥의 필수 패키지 매니저&lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;윈도우에 &lt;code&gt;winget&lt;/code&gt;이 있다면, 맥에는 &lt;strong&gt;Homebrew&lt;/strong&gt;가 있어요. 거의 모든 개발 도구를 터미널 명령어 한 줄로 설치할 수 있게 해주는 패키지 매니저입니다. 맥북 개발 환경의 시작점이라고 볼 수 있어요.&lt;/p&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Terminal — Homebrew 설치&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# Homebrew 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# M1/M2/M3 칩 맥북은 설치 후 PATH 추가 필수!&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;echo 'eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;' &gt;&gt; ~/.zprofile&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 설치 확인&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;brew --version&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;  Homebrew 자주 쓰는 명령어&lt;/h3&gt;

    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;
          &lt;tr&gt;&lt;th&gt;명령어&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;brew install 패키지명&lt;/code&gt;&lt;/td&gt;&lt;td&gt;패키지 설치&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;brew uninstall 패키지명&lt;/code&gt;&lt;/td&gt;&lt;td&gt;패키지 삭제&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;brew update&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Homebrew 자체 업데이트&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;brew upgrade&lt;/code&gt;&lt;/td&gt;&lt;td&gt;설치된 패키지 전체 업데이트&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;brew list&lt;/code&gt;&lt;/td&gt;&lt;td&gt;설치된 패키지 목록 확인&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;brew install --cask 앱이름&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GUI 앱 설치 (예: VS Code, Chrome)&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;div class=&quot;tip tip-green&quot;&gt;
      &lt;div class=&quot;tip-icon&quot;&gt;✅&lt;/div&gt;
      &lt;div class=&quot;tip-body&quot;&gt;&lt;strong&gt;M1/M2/M3 칩 주의:&lt;/strong&gt; 인텔 맥은 &lt;code&gt;/usr/local&lt;/code&gt;에, Apple Silicon 맥은 &lt;code&gt;/opt/homebrew&lt;/code&gt;에 설치돼요. PATH 설정을 빠뜨리면 &lt;code&gt;brew: command not found&lt;/code&gt; 오류가 나니 꼭 챙겨주세요.&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 3. 터미널 --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step3&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;03&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;터미널 업그레이드 — iTerm2 + Oh My Zsh&lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;기본 터미널도 쓸 수 있지만, &lt;strong&gt;iTerm2&lt;/strong&gt;와 &lt;strong&gt;Oh My Zsh&lt;/strong&gt;를 함께 쓰면 자동완성, 컬러 테마, Git 상태 표시 등이 추가되어 생산성이 크게 올라가요.&lt;/p&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Terminal — iTerm2 + Oh My Zsh 설치&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 1. iTerm2 설치 (Homebrew로 한 방에)&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;brew install --cask iterm2&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 2. Oh My Zsh 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 3. 인기 테마 Powerlevel10k 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
  ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 4. ~/.zshrc 에서 테마 변경&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;ZSH_THEME=&quot;powerlevel10k/powerlevel10k&quot;&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;  유용한 Oh My Zsh 플러그인&lt;/h3&gt;

    &lt;div class=&quot;card-grid&quot;&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;zsh-autosuggestions&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;이전에 입력했던 명령어를 흐릿하게 미리 보여줘요. Tab으로 바로 완성!&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;zsh-syntax-highlighting&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;명령어가 올바르면 초록색, 틀리면 빨간색으로 보여줘요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;z&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;자주 가는 폴더를 기억해서 &lt;code&gt;z 폴더명&lt;/code&gt;만으로 이동 가능해요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;~/.zshrc — 플러그인 추가&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 플러그인 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;brew install zsh-autosuggestions zsh-syntax-highlighting&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# ~/.zshrc의 plugins 줄을 아래처럼 수정&lt;/span&gt;
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)

&lt;span class=&quot;comment&quot;&gt;# 적용&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;source ~/.zshrc&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 4. Git --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step4&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;04&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;Git 설정&lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;맥에는 기본 Git이 설치되어 있지만, Homebrew로 최신 버전을 따로 설치하는 걸 추천해요. 그 다음 기본 사용자 정보와 SSH 키를 설정해두면 GitHub 연동이 훨씬 편해집니다.&lt;/p&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Terminal — Git 설정&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 최신 Git 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;brew install git&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 사용자 정보 등록 (GitHub 계정 정보와 동일하게)&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;git config --global user.name &quot;Your Name&quot;&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;git config --global user.email &quot;your@email.com&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 기본 브랜치명 main으로 설정&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;git config --global init.defaultBranch main&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# SSH 키 생성 (GitHub 연동용)&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;ssh-keygen -t ed25519 -C &quot;your@email.com&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 공개키 클립보드에 복사 → GitHub Settings &gt; SSH Keys에 붙여넣기&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;pbcopy &lt; ~/.ssh/id_ed25519.pub&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;tip tip-green&quot;&gt;
      &lt;div class=&quot;tip-icon&quot;&gt; &lt;/div&gt;
      &lt;div class=&quot;tip-body&quot;&gt;&lt;strong&gt;SSH 키 등록 방법:&lt;/strong&gt; GitHub 로그인 → &lt;strong&gt;Settings → SSH and GPG keys → New SSH key&lt;/strong&gt;에서 복사한 키를 붙여넣으면 돼요. 이후엔 매번 비밀번호 없이 push/pull이 가능해집니다.&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 5. VS Code --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step5&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;05&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;VS Code 설치 &amp; 추천 익스텐션&lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;VS Code는 현재 가장 많이 쓰이는 코드 에디터예요. Homebrew로 간단하게 설치할 수 있고, 터미널에서 바로 열 수 있도록 &lt;code&gt;code&lt;/code&gt; 명령어도 등록해두세요.&lt;/p&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Terminal — VS Code 설치&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# VS Code 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;brew install --cask visual-studio-code&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 터미널에서 'code .' 명령어로 바로 열기 위한 PATH 등록&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# VS Code 내부에서 Cmd+Shift+P → &quot;Shell Command: Install 'code' command&quot; 실행&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;  필수 익스텐션 추천&lt;/h3&gt;

    &lt;div class=&quot;card-grid&quot;&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;GitHub Copilot&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;AI가 코드를 자동 완성해줘요. 학생은 무료로 사용 가능!&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-both&quot;&gt;학생무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Prettier&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;저장할 때마다 코드 스타일을 자동으로 정리해줘요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Python (ms-python)&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;파이썬 개발 필수. 자동완성, 디버깅, 린팅 모두 지원.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;GitLens&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;코드 한 줄 한 줄이 누가 언제 작성했는지 바로 보여줘요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-both&quot;&gt;무료/유료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Material Icon Theme&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;파일 아이콘을 예쁘게 바꿔줘서 파일 구분이 훨씬 쉬워요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Error Lens&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;오류 메시지를 코드 줄 옆에 바로 표시해줘요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 6. 언어별 환경 --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step6&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;06&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;개발 언어별 환경 설정&lt;/div&gt;
    &lt;/div&gt;

    &lt;h3&gt;  Python&lt;/h3&gt;
    &lt;p&gt;맥에는 파이썬이 기본 설치되어 있지만, 버전 관리를 위해 &lt;strong&gt;pyenv&lt;/strong&gt;를 사용하는 걸 추천해요. 프로젝트마다 다른 버전을 쉽게 전환할 수 있어요.&lt;/p&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Python 환경 설정&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;cmd&quot;&gt;brew install pyenv&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# ~/.zshrc에 추가&lt;/span&gt;
&lt;span class=&quot;str&quot;&gt;export PYENV_ROOT=&quot;$HOME/.pyenv&quot;&lt;/span&gt;
&lt;span class=&quot;str&quot;&gt;export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;&lt;/span&gt;
&lt;span class=&quot;str&quot;&gt;eval &quot;$(pyenv init -)&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 파이썬 설치 및 전역 버전 지정&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;pyenv install 3.12.0&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;pyenv global 3.12.0&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;⬡ Node.js&lt;/h3&gt;
    &lt;p&gt;Node.js도 버전 관리 도구인 &lt;strong&gt;nvm&lt;/strong&gt;을 먼저 설치하고, 그 다음에 Node를 설치하는 방식을 권장해요.&lt;/p&gt;

    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Node.js 환경 설정&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;cmd&quot;&gt;brew install nvm&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# ~/.zshrc에 추가&lt;/span&gt;
&lt;span class=&quot;str&quot;&gt;export NVM_DIR=&quot;$HOME/.nvm&quot;&lt;/span&gt;
&lt;span class=&quot;str&quot;&gt;[ -s &quot;/opt/homebrew/opt/nvm/nvm.sh&quot; ] &amp;&amp; \. &quot;/opt/homebrew/opt/nvm/nvm.sh&quot;&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# LTS 버전 설치&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;nvm install --lts&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;nvm use --lts&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;☕ Java&lt;/h3&gt;
    &lt;div class=&quot;code-block&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;&lt;div class=&quot;code-dot&quot;&gt;&lt;/div&gt;
        &lt;span class=&quot;code-label&quot;&gt;Java 환경 설정&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# OpenJDK 설치 (Temurin 배포판 추천)&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;brew install --cask temurin&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 버전 확인&lt;/span&gt;
&lt;span class=&quot;cmd&quot;&gt;java -version&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 7. 앱 추천 --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step7&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;07&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;개발자 필수 앱 추천&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;card-grid&quot;&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;GitHub Desktop&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;GUI로 Git을 관리할 수 있어요. 터미널이 아직 낯선 분들에게 추천.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Docker Desktop&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;컨테이너 기반 개발 환경. 팀 프로젝트 시작 시 필수.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-both&quot;&gt;무료/유료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Postman&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;API 테스트 도구. 백엔드 개발 시 없으면 안 됩니다.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-both&quot;&gt;무료/유료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;TablePlus&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;DB 클라이언트. MySQL, PostgreSQL, SQLite 모두 지원해요.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-both&quot;&gt;무료/유료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Notion&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;개발 일지, 스터디 노트, 프로젝트 관리까지 한 번에.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;card&quot;&gt;
        &lt;div class=&quot;card-icon&quot;&gt; &lt;/div&gt;
        &lt;div class=&quot;card-name&quot;&gt;Rectangle&lt;/div&gt;
        &lt;div class=&quot;card-desc&quot;&gt;창 크기를 단축키로 딱딱 맞춰줘요. 윈도우 snap 기능과 유사.&lt;/div&gt;
        &lt;span class=&quot;card-tag tag-free&quot;&gt;무료&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;tip tip-blue&quot;&gt;
      &lt;div class=&quot;tip-icon&quot;&gt; &lt;/div&gt;
      &lt;div class=&quot;tip-body&quot;&gt;&lt;strong&gt;Homebrew로 한 번에 설치하기:&lt;/strong&gt; &lt;code&gt;brew install --cask github docker postman tableplus notion rectangle&lt;/code&gt; 명령어 한 줄로 위 앱 전부를 설치할 수 있어요!&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 8. 단축키 --&gt;
  &lt;div class=&quot;section&quot; id=&quot;step8&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;08&lt;/div&gt;
      &lt;div class=&quot;section-title&quot;&gt;맥북 개발자 필수 단축키 모음&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;
          &lt;tr&gt;&lt;th&gt;단축키&lt;/th&gt;&lt;th&gt;기능&lt;/th&gt;&lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Space&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;Spotlight 검색 (앱 실행, 파일 검색)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Tab&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;앱 전환&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;`&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;같은 앱 내 창 전환&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;4&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;영역 선택 스크린샷&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;5&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;화면 녹화 &amp; 스크린샷 옵션&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;A&lt;/kbd&gt; / &lt;kbd&gt;E&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;터미널에서 줄 맨 앞 / 맨 뒤로 이동&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;U&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;터미널에서 현재 줄 전체 삭제&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;D&lt;/kbd&gt;&lt;/td&gt;&lt;td&gt;VS Code에서 같은 단어 동시 선택&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;kbd&gt;Option&lt;/kbd&gt; + 클릭&lt;/td&gt;&lt;td&gt;VS Code 멀티 커서&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;div class=&quot;tip tip-red&quot;&gt;
      &lt;div class=&quot;tip-icon&quot;&gt;⚠️&lt;/div&gt;
      &lt;div class=&quot;tip-body&quot;&gt;&lt;strong&gt;윈도우 유저 주의:&lt;/strong&gt; 맥에서는 &lt;kbd&gt;Ctrl&lt;/kbd&gt; 대신 &lt;kbd&gt;Cmd&lt;/kbd&gt;를 주로 사용해요. 복사는 &lt;kbd&gt;Cmd&lt;/kbd&gt;+&lt;kbd&gt;C&lt;/kbd&gt;, 붙여넣기는 &lt;kbd&gt;Cmd&lt;/kbd&gt;+&lt;kbd&gt;V&lt;/kbd&gt;. 처음엔 헷갈리지만 금방 익숙해져요!&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;!-- 마무리 --&gt;
  &lt;div class=&quot;outro&quot;&gt;
    &lt;h2&gt;  이제 개발 준비 완료!&lt;/h2&gt;
    &lt;p&gt;Homebrew → 터미널 → Git → VS Code → 언어 환경 순서로 세팅하면&lt;br&gt;어떤 프로젝트든 바로 시작할 수 있어요.&lt;br&gt;&lt;br&gt;
    궁금한 점이나 더 추가되었으면 하는 내용이 있다면 댓글로 남겨주세요  &lt;/p&gt;
  &lt;/div&gt;

&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>IT issues</category>
      <category>Git설정</category>
      <category>homebrew</category>
      <category>iterm2</category>
      <category>MacOS</category>
      <category>ohmyzsh</category>
      <category>vscode</category>
      <category>개발환경설정</category>
      <category>맥북</category>
      <category>맥북개발자</category>
      <category>맥북세팅</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/29</guid>
      <comments>https://yjinstudy.tistory.com/29#entry29comment</comments>
      <pubDate>Wed, 22 Apr 2026 13:14:32 +0900</pubDate>
    </item>
    <item>
      <title>[자바] 백준 알고리즘 1166번: 선물</title>
      <link>https://yjinstudy.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1606657465944&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Scanner;

public class B_1166 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int l = scanner.nextInt();
        int w = scanner.nextInt();
        int h = scanner.nextInt();

        //시간이 너무 많이 걸리는 것이 문제다. 가장 큰 변을 찾고 그 변을 이분탐색하는 것이 적절하다.
        double start = 0;
        double stop = Math.max(Math.max(l, w), h);

        int i;
        for (i = 0; i &amp;lt; 10000; i++) {
            double mid = (start+stop) / 2;
            if ((long)l/mid * (long)w/mid * (long)h/mid &amp;gt;= n) {
                start = mid;
            }
            else {
                stop = mid;
            }
        }
        System.out.println(stop);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1166&quot;&gt;https://www.acmicpc.net/problem/1166&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1606657304538&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1166번: 선물&quot; data-og-description=&quot;첫째 줄에 N L W H가 주어진다. 모든 값은 1,000,000,000보다 작거나 같은 자연수이다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1166&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1166&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SYM5k/hyIoTcYwBG/hpnTF9WdWqYpWg1icDGx81/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1166&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1166&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SYM5k/hyIoTcYwBG/hpnTF9WdWqYpWg1icDGx81/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1166번: 선물&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N L W H가 주어진다. 모든 값은 1,000,000,000보다 작거나 같은 자연수이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>coding/Java</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/28</guid>
      <comments>https://yjinstudy.tistory.com/28#entry28comment</comments>
      <pubDate>Sun, 29 Nov 2020 22:45:52 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] divmod함수</title>
      <link>https://yjinstudy.tistory.com/27</link>
      <description>&lt;p&gt;divmod함수는 몫과 나머지를 한 번에 구하고 싶을 때 사용하는 함수이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;a, b = divmod(num)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이런 식으로 사용하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로그래머스 124나라의 숫자를 풀다가 처음보는 함수가 있길래 찾아보았다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 문제를&amp;nbsp; 풀 때 처음에는 막연히 10진수를 2진수로 변환하는 것처럼 if문을 사용하여서 만들었는데 너무 복잡하고 시간도 오래 걸렸다. 그러다 문자열로 푼 방법을 발견했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아마도 answer = ' '이렇게 answer을 문자열 형식으로 준 것이 힌트였던 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>coding/python</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/27</guid>
      <comments>https://yjinstudy.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 27 Nov 2020 23:11:11 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] enumerate - 내장함수</title>
      <link>https://yjinstudy.tistory.com/26</link>
      <description>&lt;p&gt;오늘 프로그래머스에서 프린터 문제를 풀다가 같은 수가 여러 개 나오면 max함수를 사용해도 문제가 해결되지 않는다는 것을 알게 되었다. 이러한 경우에는 어떻게 해야할지 고민하다가 enumerate함수에 대해 알게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;enumerate - 순서가 있는 자료명을 입력 받아서 인덱스 값을 포함하는 enumerate 객체를 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예를 들어서 a = [1, 2, 5, 6, 7]이라는 리스트를&lt;/p&gt;
&lt;p&gt;enumerate(a)라고 하면 [(0, 1), (1, 2), (2, 5), (3, 6), (4, 7)] 이라는 리스트를 받을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자바에는 우선순위 큐가 있지만 파이썬에는 존재하지 않아 방법을 찾다가 알게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위를 리스트로 받아서 우선순위가 인덱스 값이 되도록 원소의 위치를 바꿔주었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;deque([j, i for i, j in enumerate(a)]) 이런식으로 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오늘 처음 배웠는데 유용하게 사용할 수 있는 함수인 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;특히 deque와 함께 사용했을때 더 좋은 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>deque</category>
      <category>enumerate</category>
      <category>큐</category>
      <category>파이썬</category>
      <author>아커만</author>
      <guid isPermaLink="true">https://yjinstudy.tistory.com/26</guid>
      <comments>https://yjinstudy.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 23 Nov 2020 02:02:29 +0900</pubDate>
    </item>
  </channel>
</rss>