반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 코딩유치원에 방문하신 손님께서 문의하셨던 '홈쇼핑모아'라는 사이트의 정보를 크롤링하는 프로젝트를 공유드리겠습니다.

 


1. 프로젝트 목표

 

1) 목표 사이트

https://hsmoa.com/

 

홈쇼핑모아 - 모든 홈쇼핑을 한눈에!

| 5시 14분 ~ 5시 19분 사계절 착용 가능, 클래식 스타일, 트윌 솔리드 셔츠 예작 22FW 최신상 컴포트 셔츠 3종 백화점 매장 동일 정상 제품 109,000원

hsmoa.com

 

2) 목표 데이터

오늘 이후 5일간 편성표의 날짜, 상품명, 방송시간, 가격 (사진도 요청하셨지만 난이도가 확 달라지므로 보류) 

 

 

2. 프로젝트 코드

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd

# step2.오늘 이후의 5일만 선택하기 위한 오늘 날짜 파악
info_time = time.localtime()
today = str(info_time.tm_year) + '0' +str(info_time.tm_mon) + str(info_time.tm_mday) #중간에 0은 태그의 속성값과 포맷 일치를 위함
print(today)

# step3.크롬 웹드라이버 실행 & 홈쇼핑 사이트 접속
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")
url = "https://hsmoa.com/?date="+today+"&site=&cate=식품·건강" #식품건강 카테고리
driver.get(url)
time.sleep(1)

# step4.오늘 이후 날짜 정보 획득 함수 정의
def get_target_date(driver, today):
    
    list_temp = []

    # 날짜 선택
    btn_date = driver.find_elements_by_class_name("date")

    for i in btn_date:
        if int(i.get_attribute("data-date")) > int(today):
            list_temp.append(i.get_attribute("data-date"))

    return(list_temp)


# step5.총 5일동안의 쇼핑몰 편성표 크롤링

# 날짜, 상품명, 방송시간, 가격을 담을 리스트 선언
list_date = []
list_title = []
list_airtime = []
list_price = []

# 날짜 5일이 입력된 리스트
list_five_days = get_target_date(driver, today)
print(list_five_days)

for day in list_five_days:

    url = "https://hsmoa.com/?date="+day+"&site=&cate=식품·건강"
    driver.get(url)
    time.sleep(2)

    #날짜 & 제목
    title = driver.find_elements_by_class_name("font-15")
    for i in title:
        if i.text != "": #공백 제거
            list_date.append(day)
            list_title.append(i.text)
    
    #방송시간
    airtime = driver.find_elements_by_class_name("font-12.c-midgray")
    for i in airtime:
        if i.text != "": #공백 제거
            list_airtime.append(i.text)
    
    # 가격
    price = driver.find_elements_by_class_name("strong.font-17.c-black")
    for i in price:
        if i.text != "": #공백 제거
            list_price.append(i.text)

# step6.zip 모듈을 이용해서 list를 묶어주기        
list_sum = list(zip(list_date, list_title, list_airtime, list_price))

# step7.데이터프레임의 첫행에 들어갈 컬럼명
col = ['날짜','제품명','방송시간','가격']

# step8.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)

# step9.엑셀에 저장
df.to_excel('쇼핑몰 편성표_5일.xlsx')

driver.quit()

 

<코드 실행 결과>

 

3. 프로젝트 후기

 

1) 아무 생각없이 동적 웹크롤링 방식을 사용해서 코드 실행 시간이 2분 50초나 걸렸음. (어제는 1분 10초 정도)

    --> 다음엔 requests와 bs4 패키지를 쓰는 정적 웹크롤링 방식을 사용해서 시간을 줄여야겠음.

 

2) 사진을 함께 크롤링해서 엑셀에 차례대로 삽입하는 것은 아직 효율적인 방법을 모르겠음.

    --> 추후에 도전해봐야겠음. 


끝.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 인스타그램으로 특정 태그의 게시물을 캡처하거나 좋아요를 누르는 등의 자동화를 위한 가장 첫 단계로 인스타그램을  selenium으로 자동 로그인하는 방법에 대해서 알아보겠습니다.

 

해당 강의를 따라하기 위해서는 인스타그램 아이디와 비밀번호가 필요하답니다.

(facebook 계정으로도 로그인 하는 방법이 있지만 그 방법은 다루지 않았습니다.)

 

그리고 크롬 드라이버가 설치되어 있어야 합니다. 혹시 안되어 있으신분들은 아래의 강의를 참고해주세요.

 

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

 

[Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 


1. 패키지 import

 

가장 먼저 할 일은 당연히 웹 자동화를 위한 필수 패키지를 불러오는 일입니다.

# step1. 필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

 

2. 크롬 드라이버 실행 및 인스타그램 로그인 화면 출력

 

그 다음은 크롬 드라이버를 실행하고, 인스타그램 로그인 url로 이동해보겠습니다. 아래의 코드의 경로 대신에 여러분들의 크롬 드라이버(chromedriver.exe)가 있는 경로를 입력해주어야 한다는 것 주의해주세요.

 

driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")

driver.get("https://www.instagram.com/accounts/login/")

time.sleep(1)

 

3. 아이디 & 비밀번호 입력 후 엔터

 

다음으로 해줄 일은 아이디와 비밀번호를 입력하고 엔터를 눌러주는 것입니다.

 

 

# 인스타 아이디
id = "여러분의 아이디를 입력해주세요"
# 비밀번호
pw = "여러분의 비밀번호를 입력해주세요"

# id와 pw를 입력하는 창의 요소 정보 획득
input = driver.find_elements_by_tag_name("input")

# 아이디를 입력
input[0].send_keys(id)

# 비밀번호 입력
input[1].send_keys(pw)

# 엔터
input[1].send_keys(Keys.RETURN)
time.sleep(5)

 

4. 옵션 설정 단계 통과하기

 

위에서 로그인을 하고나면 아래와 같은 화면이 출력됩니다. 그것도 2개나 말이죠.

둘 모두 '나중에 하기' 버튼을 찾아서 클릭해서 장애물을 극복해줍시다!

 

첫번째 장애물. 로그인 정보 저장 여부

 

두번째 장애물. 알림 설정 여부

 

# 로그인 정보 저장 여부 ("나중에 하기 버튼 클릭")
btn_later1 = driver.find_element_by_class_name('_acan._acao._acas')
btn_later1.click()
time.sleep(5)

# 알림 설정 ("나중에 하기 버튼 클릭")
btn_later2 = driver.find_element_by_class_name('_a9--._a9_1')
btn_later2.click()

 

참고로 저는 보통 xpath로 element를 찾는 방식을 선호하는데, 하루만에 xpath가 변경되거나 알림 설정의 '나중에 하기' 버튼을 클릭할 때는 잘 작동하지 않아서 class_name을 이용했습니다.

 

여기까지 하면 로그인이 완료되고 여러분들의 인스타그램 홈화면이 나올거예요.

 

5. 전체코드 (좀 더 세련된 코드)

 

전체 코드를 함수 개념을 이용해서 좀 더 깔끔하게 정리했습니다. 위에서 코드가 실행되는 흐름을 이해하셨다면 아래의 코드를 사용하시면 됩니다.

# step1.필요한 패키지와 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# step2.아이디, 비밀번호 설정
id = "여러분의 아이디를 입력해주세요"
pw = "여러분의 비밀번호를 입력해주세요"

# step3.크롬 웹드라이버 실행
driver = webdriver.Chrome(r"C:\Users\SANGWOO\Desktop\chromedriver.exe")

# step4.인스타그램 로그인 함수 정의
def login(id, pw):
    # 로그인 페이지로 이동
    driver.get("https://www.instagram.com/accounts/login/")
    time.sleep(1)
    
    # id와 pw를 입력하는 창의 요소 정보 획득
    input = driver.find_elements_by_tag_name("input")

    # 아이디를 입력
    input[0].send_keys(id)

    # 비밀번호 입력
    input[1].send_keys(pw)

    # 엔터
    input[1].send_keys(Keys.RETURN)
    time.sleep(5)

    # 로그인 정보 저장 여부 팝업창 제거 ("나중에 하기 버튼 클릭")
    btn_later1 = driver.find_element_by_class_name('_acan._acao._acas')
    btn_later1.click()
    time.sleep(5)

    # 알림 설정 팝업창 제거 ("나중에 하기 버튼 클릭")
    btn_later2 = driver.find_element_by_class_name('_a9--._a9_1')
    btn_later2.click()

# step5.로그인 함수 실행
login(id,pw)

 


오늘 준비한 내용은 여기까지입니다.

 

감사합니다. 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

저번 시간에 기본적인 슬라이드를 만드는 법과 원하는 레이아웃(혹은 템플릿)의 슬라이드를 만드는 방법을 소개드렸습니다.

 

이번 시간에는 지난 시간에 잠시 언급하였던 placeholder, 쉽게 말해 "글자, 그림과 같은 컨텐츠를 담는 틀"에 대하여 알아보고, 틀 안에 내용을 채우는 법에 대해서 공부해보겠습니다.


1. placeholder의 종류

 

placeholder의 종류는 총 18가지가 있다고 합니다만, 우선 기본 레이아웃들에 들어있는 7가지만 소개드려보겠습니다.

쉬운 이해를 돕기 위해 우리에게 익숙한 ppt 화면을 바탕으로 설명드리겠습니다.

 

1) Tilte: 제목 상자

2) Subtitle: 부제목 상자

 

3) Content Placeholder: 콘텐츠 상자

 

4) Picture Placeholder: 그림 상자

5) Text Placeholder: 텍스트 상자

 

6) Vertical Text Placeholder: 세로 텍스트 상자

7) Vertical Title: 세로 제목

 

 

만약 11가지 레이아웃가 어떤 Placeholder들을 갖고 있는지 확인해보고 싶으시다면 아래의 코드를 실행시켜 보세요.

(결과는 생략할테니 여러분들이 직접 확인해보세요ㅎㅎ)

 

코드
#python-pptx의 가장 기본이 되는 Presentation 클래스 불러오기
from pptx import Presentation

#Presentation 객체 생성
prs = Presentation()

# 반복문으로 기본 레이아웃 11가지 만들기
for i in range(0, 11):
    print("\n======="+"%d"%(i+1)+"번 슬라이드=======")
    slide = prs.slides.add_slide(prs.slide_layouts[i])
    
    # 생성한 레이아웃 안의 모든 placeholder 이름 확인
    for shape in slide.placeholders:
        print('%s' % (shape.name))

 

 

2. placeholder에 내용 넣기

 

1) 텍스트

 

제목 상자와 부제목 상자에 글을 입력하는 방법은 지난 시간에 잠시 다루어 보았습니다.

 

placeholders[인덱싱 번호]로 각 상자들을 변수에 넣어서 객체화 해준 다음, text 함수를 이용해서 텍스트를 입력해주시면 된답니다. 간단하죠?

 

코드의 실행 결과는 지난 시간에 해보았으니 따로 결과는 확인하지 않겠습니다.

 

코드

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)

# 제목과 부제 박스를 선택해서 변수에 대입
title = slide.placeholders[0]   # title = slide.shapes.title와 동일
subtitle = slide.placeholders[1]

# 제목과 부제에 글자 입력
title.text = "안녕하세요, 여기는 코딩유치원입니다."
subtitle.text = "python-pptx 강의입니다."

# 추가 문단 입력하고 싶을 때 해당 코드 사용
tf = subtitle.text_frame
p = tf.add_paragraph()
p.text = '추가 문단'

#ppt 저장
prs.save('test.pptx')

 

 

2) 그림

 

이번에는 그림을 넣어보기 위해서 Picture Placeholder가 있는 9번째 레이아웃을 사용했답니다. 그리고 저는 현재 실행하고 있는 파이썬 파일과 같은 경로에 그림 상자에 넣어 줄 고양이 사진을 따로 저장해주었습니다.

 

 

* 참고

=======9번 슬라이드=======
Title 1
Picture Placeholder 2
Text Placeholder 3

 

기본 슬라이드 11개 중에 9번째 슬라이드인 '캡션 있는 그림' 슬라이드입니다. 아래 그림을 보시면 위에서부터 순서대로 '그림 - 제목 - 텍스트' 상자 순일 것 같지만 코드로 해당 슬라이드의 placeholders 인덱싱을 보면 Title이 1번, 그림상자가 2번, 텍스트 상자가 3번인 것을 확인하실 수 있어요.

기본 9번 슬라이드

 

텍스트를 넣을 때와 흐름은 비슷하니 코드를 이해하시는데에 어려움은 없으실거예요.

 

코드

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[8]  # 그림 상자가 있는 슬라이드
slide = prs.slides.add_slide(slide_layout)

# Picture Placeholder 선택
ph_picture = slide.placeholders[1] # 0:title, 1:Picture, 2:Text

# 현재 경로에 있는 cat.jpt를 그림 상자에 추가
picture = ph_picture.insert_picture('cat.jpg')

# 저장
prs.save('test_picture.pptx')

 

결과

 

귀여운 고양이 그림이 그림상자에 잘 들어간 것을 확인하실 수 있습니다.

 

오늘 준비한 내용은 여기까지 입니다.

 

오늘도 코딩유치원을 찾아주신 여러분들께 감사드립니다.


<참고 자료>

python-pptx 공식문서_Working with placeholders 부분

https://python-pptx.readthedocs.io/en/latest/user/placeholders-using.html

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


1. python-pptx 설치하기

 

2. ppt 생성하고 슬라이드 추가하기

 

우리가 파워포인트를 가장 처음 켰을 때, 프로그램을 실행시키고, 새 슬라이드를 추가하 듯이 파이썬 코드로 동일한 상황을 구현해보겠습니다.

 

<코드>

#python-pptx의 가장 기본이 되는 Presentation 클래스 불러오기
from pptx import Presentation

#Presentation 객체 생성
prs = Presentation()

#슬라이드의 레이아웃 선택
slide_layout = prs.slide_layouts[0]

#선택한 레이아웃의 슬라이드 추가
slide = prs.slides.add_slide(slide_layout)

#pptx 파일 저장
prs.save('test.pptx')

 

<결과>

 

 

아시다시피 ppt의 기본 레이아웃(Office Theme)는 11개가 있습니다. 아래의 순서대로 prs.slide_layouts[ ]의 괄호 안에 0~11 중 숫자 하나를 선택해서 넣어주면 해당 레이아웃을 사용할 수 있습니다.

다양한 레이아웃

 

3. 슬라이드에 글자 쓰기

 

방금 전 추가했던 '제목+부제' 레이아웃(혹은 템플릿)에는 두 가지 placeholder가 존재합니다. 여기서 placeholder는 그냥 상자라고 생각하시면 간단합니다. (다음시간에 placeholder의 여러 종류에 대해서 자세히 알아보겠습니다.)

 

우리는 이 placeholder를 선택해서 글자를 입력해주면 됩니다. 긴 설명보다는 코드를 실행해보시고 결과와 비교해보시는게 빠를 것 같아요.

 

<코드>

from pptx import Presentation

prs = Presentation()

slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)

# 제목과 부제 박스를 선택해서 변수에 대입
title = slide.placeholders[0]   # title = slide.shapes.title와 동일
subtitle = slide.placeholders[1]

# 제목과 부제에 글자 입력
title.text = "안녕하세요, 여기는 코딩유치원입니다."
subtitle.text = "python-pptx 강의입니다."

# 추가 문단 입력하고 싶을 때 해당 코드 사용
tf = subtitle.text_frame
p = tf.add_paragraph()
p.text = '추가 문단'

#ppt 저장
prs.save('test.pptx')

 

<결과>

 


오늘 준비한 내용은 여기까지입니다.

 

다음 시간에 더 알찬 내용으로 돌아오겠습니다. 감사합니다. 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 자바를 공부할 일이 있어서 공부 겸 포스팅을 해보려합니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


1. if문

 

조건문은 컴퓨터가 어떤 조건에 따라서 다른 행동들을 할 수 있도록 해주는 코드입니다. 주로 if문을 사용하며, switch/case문도 있습니다.

 

if (조건식) {
    // code
} else if (조건식) {

} else {

}

 

당연한 이야기지만 if와 else는 하나씩만 가능하고, else if는 여러 개를 입력 가능합니다.

 

<비교연산자 & 비교연산자 정리>

비교연산자 & 논리연산자 설명
x < y x가 y보다 작으면 참
x > y x가 y보다 크면 참
x == y x와 y가 같으면 참
x != y x와 y가 같지 않으면 참
x >= y x가 y보다 크거나 같으면 참
x <= y x가 y보다 작거나 같으면 참
x && y x와 y 둘 모두가 참이면 참
x || y x와 y 둘 중 하나가 참이면 참
!x x가 거짓이면 참

 

실제로 어떻게 쓸 수 있는지 연습해봤습니다. 

public class IfApp {

	public static void main(String[] args) {

        int x = 1;

        if(x>2) {
            System.out.println("코딩유치원");
        } else {
            System.out.println("손생 자바공부중");
        }
	}
}

 

2. while문 / for

 

조건에 따라 특정한 작업을 반복하게 하는 제어문을 반복문이라고 하며, while문과 for문이 있습니다.

 

두 반복문의 주요한 차이점으로는 while문은 조건식이 참이면 무한히 반복할 수 있다는 점입니다. 보통 외부에서 어떤 입력이 들어올 때까지 대기할 때 while문을 사용하고, 그 외에는 반복 횟수가 정해진 for문을 주로 사용하는 것으로 알고 있습니다.

 

while (조건식) {

    // 반복할 코드
    
}


for (초기값; 조건문; 증가값) {

    // 초기값이 증가값만큼씩 증가하면서 조건문을 만족하지 않을 때까지 반복
    
}

 

실제로 어떻게 쓸 수 있는지 연습해봤습니다.  

 

public class LoopApp {
 
    public static void main(String[] args) {
         
        System.out.println("===== while문 =====");
        int i = 0;
        while(i < 3) {
            System.out.println(i+1);
            i++;
        }
        
        System.out.println("====== for문 ======");
        for(int j=4; j < 6; j++) {
            System.out.println(j);
        }
    }
}

while문의 경우엔 무한루프에 빠지는 것을 방지하기 위해서 조건문의 변수를 1씩 증가 시키는 ++연산자를 사용한 점 참고해주세요.

 

 

<실행 결과>

===== while문 =====
1
2
3
====== for문 ======
4
5
6

 

 

3. for문과 배열

 

for문은 주로 배열과 함께 사용됩니다. 배열의 요소를 하나씩 참조하며 어떤 처리를 해야할 때 사용하죠.

 

아래의 코드는 for문과 배열을 함께 사용하는 아주 기본적인 방법입니다. 배열을 하나씩 참조하면서 배열 안의 요소를 하나씩 출력하는 코드입니다.

public class LoopApp {
	 
    public static void main(String[] args) {
         
    	String[] numbers = {"one", "two", "three"};

    	for(int i=0; i<numbers.length; i++) {

    	    System.out.println(numbers[i]);
    	}
    }
}

 

<실행 결과>

one
two
three

 


오늘은 자바의 제어문에 대해서 가볍게 알아보았습니다.

 

다음 시간 부터는 자바의 꽃인 객체지향의 개념에 대해서 좀 더 깊이 공부해보겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬으로 여러명에게 첨부파일이 포함된 메일을 보내는 방법에 대해 공부해보겠습니다.

 

<파이썬으로 이메일 보내기 관련 글>

2022.03.23 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 2편. smtplib와 email 모듈

2022.06.01 - [파이썬 패키지/이메일] - [python/imaplib] 파이썬으로 구글 Gmail 읽기

 

1. 구글 메일 자동화를 위한 설정

2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기

 

2. 네이버 메일 자동화를 위한 설정

2022.06.15 - [파이썬 패키지/이메일] - [#shorts] 파이썬으로 네이버 메일 보내기 위한 초간단 설정

 


 

이전 시간까지는 정말 단순하게 단 한명에게 메일 제목과 내용만 포함하여 메일을 보내는 것을 해보았습니다. 

 

 

오늘 배워볼 내용은 한번에 여러명에게, 첨부파일을 포함시켜서 메일을 보내는 방법입니다.

 

1. 관련 모듈, 클래스 불러오기

 

우선 오늘 새로 등장하는 모듈과 클래스들이 많으므로 쉬운 이해를 위해서 기능에 따라 배치해보았습니다.

 

그림을 기준으로 소개드리자면,

 

MIMEBase:

첨부파일이 포함된 메일은 멀티파트(Multipart)로 구성되어 있으며, MIMEBase가 기본 포맷의 역할을 합니다. 즉, MIMEBase라는 종이 위에 텍스트도 넣고, 첨부파일도 넣는 느낌인 것입니다.

 

Header:

Header는 사람의 문장을 컴퓨터가 이해할 수 있는 문장으로 변환해줄 때 사용하는 모듈로 전반적으로 사용합니다.

 

MIMEText:

지난 시간에도 사용했던 MIMEText 클래스는 '본문 메세지'를 작성할 때 사용합니다.

 

MIMEApplication:

MIMEApplication 클래스는 파일을 첨부해줄 때 사용합니다. 

 

 

2. 전체 코드

 

위의 개념도만 대략 이해하시면, 그 외의 부분은 주석을 읽어보시면서 따라해보시면 되리하 생각합니다.

(더 친절하지 못해 죄송합니다..ㅜㅜ)

#step1.관련 모듈, 클래스 불러오기
import os
import smtplib
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication


#step2.SMTP 서버를 dictionary로 정의
smtp_info = {
    'gmail.com': ('smtp.gamil.com', 587),
    'naver.com': ('smtp.naver.com', 587),
    'outlook.com': ('smtp-mail.outlook.com', 587),
    'hotmail.com': ('smtp-mail.outlook.com', 587),
    'yahoo.com': ('smtp.mail.yahoo.com', 587),
    'nate.com': ('smtp.mail.nate.com', 465),
    'daum.net': ('smtp.daum.net', 465),
    'hanmail.net': ('smtp.daum.net',465)
}

#step3.메일 보내는 함수 정의 (발신 메일, 수신 메일(여러개 가능), 제목, 본문, 첨부파일 경로, 비밀번호)
def send_email(From, To, subject, message, attach_files=(), passwd='', subtype='plain'):
    
    
    #step4.멀티파트로 메일을 만들기 위한 포맷 생성
    form = MIMEBase('multipart', 'mixed')
    
    #step5.입력받은 메일주소와 제목, 본문 등의 문자열을 인코딩해서 form에 입력
    form['From'] = From
    form['To'] = ', '.join(To) #수신 메일 리스트를 문자열로 변환 (,와 한칸 공백을 추가해서 구분)
    form['Subject'] = Header(subject.encode('utf-8'), 'utf-8')
    msg = MIMEText(message.encode('utf-8'), _subtype=subtype, _charset='utf-8')
    form.attach(msg)
    
    #step6.여러개의 파일을 하나씩 첨부
    for fpath in attach_files:
        
        folder, file = os.path.split(fpath) # 파일의 절대 경로를 입력하면, 두 가지 문자열을 나눠서 반환
                                            # (ex./home/User/Desktop/file.txt --> (/home/User/Desktop/, file.txt)
        
        with open(fpath, 'rb') as f: # 첨부 파일을 열어서 내용을 가져옴
            body = f.read()
        
        msg = MIMEApplication(body, _subtype=subtype)
        
        msg.add_header('Content-Disposition', 'attatchment',
                        filename=(Header(file, 'utf-8').encode()))
        form.attach(msg)
        
    #step7.SMTP 서버 로그인 및 작성된 메일 보내기
    id, host = From.rsplit("@",1) #발신인 메일 주소의 @를 기준으로 id와 host로 나눔
    
    smtp_server, port = smtp_info[host] #step2의 dict를 이용해서 host와 port 정보들을 받아옴
    
    # SMTP 서버 접속 여부 확인
    if port == 587:
        smtp = smtplib.SMTP(smtp_server, port)
        rcode1, _ = smtp.ehlo()
        rcode2, _ = smtp.starttls()
    
    else:
        smtp = smtplib.SMTP_SSL(smtp_server, port)
        rcode1, _ = smtp.ehlo()
        rcode2 = 220 
        
    if rcode1 != 250 or rcode2 != 220:
        smtp.quit()
        return '연결에 실패하였습니다.'
    
    smtp.login(From, passwd)
    smtp.sendmail(From, To, form.as_string())    
    smtp.quit
    

#step8.실제 함수 실행 부분
me = 'continent9@naver.com'
receivers = ['codingswson@gmail.com','sonsangwoo91@gmail.com']

subject = '파이썬으로 메일 보내기 테스트'
message = """
안녕하세요, 코딩유치원에서 제작한 '메일 전송 봇'입니다.

첨부드리는 파일 참고 부탁드립니다.

감사합니다.
"""

attatch_files = ['5.png', 'test_excel.xlsx','Excel_sum.py','text파일.txt']
send_email(me, receivers, subject, message, attatch_files, passwd='네이버 로그인 비밀번호')

 

글을 마치며, 제가 네이버 메일로 발신했을 땐 정상작동 하는 코드가, 이상하게도 구글 메일로 발신하려고 하면 에러가 납니다. 당연히 구글 비밀번호를 '앱 비밀번호'로 하였는데도 말이죠.

 

혹시 여러분들은 되신다면 댓글을 달아주시면 감사하겠습니다!

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


 

파이썬 코드를 이용해서 네이버 메일을 발신/수신하기 위해서는 아래의 설정이 반드시 선행되어야합니다.

 

해당 설정을 하지 않으시고 파이썬 코드를 실행하시면 아래와 같은 오류가 출력된답니다.

 

SMTPAuthenticationError: (535, b'5.7.1 Username and Password not accepted wIKXs+XGQSmZsM0dOtS9cA - nsmtp')

 

그럼 지금부터 함께 설정을 해보겠습니다.

 

설정 방법

 

step1. 사용하고자 하시는 네이버 메일에 로그인 하신 후, 화면 왼쪽에 위치한 '외부메일 가져오기' 탭 오른쪽에 위치한 톱니바퀴 아이콘을 클릭해주세요.

 

 

step2. 화면이 전환되었다면 아마 '외부 메일 가져오기' 탭이 클릭된 상태일 거예요. 'POP3/IMAP 설정' 탭을 클릭하신 후, 아래 그림과 같이 사용함을 클릭해주세요.

 

 

정말 간단하죠?

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

이번 시간에는 아주 간단하지만 코딩 효율을 올려줄 수 있는 유용한 팁을 하나 소개드리려 합니다.

 

VS CODE를 사용하시다 보면 아래와 같이 괄호나 따옴표를 하나만 입력해도 쌍(Pair)으로 자동 완성 되는 상황을 무조건 겪게 됩니다.

 

 

만약 다음 줄에 이어서 코드를 작성하기 위해서 여러분들은 어떻게 해오셨나요? 아마도 대부분은 저처럼 오른쪽 방향키로 오른손을 가져가서 눌러주신 후, 다시 손을 복귀시키셨을거예요.

 

오늘 소개 드릴 내용은 'Tap을 눌러서 커서를 오른쪽으로 한칸씩 이동시키는 방법'입니다.

 

 

셋팅 방법은 정말 간단합니다. VS CODE에서 아래와 같은 순서로 확장(Extension)을 설치해주시면 됩니다. 설치만 하시면 바로 적용이 됩니다.

 

 

설치가 완료 되셨다면 같은 상황에서 살포시 왼쪽 새끼손가락을 움직여 tap을 눌러보세요!

 

여러분들의 코딩 속도가 10%는 상승할거라고 자신합니다. 

 


<참고 자료>

1. vscode 자동완성 함수안에서 괄호밖으로 탭키로 나가기_개인블로그(PABBURI)

https://www.pabburi.co.kr/content/pds/vscode-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%ED%95%A8%EC%88%98%EC%95%88%EC%97%90%EC%84%9C-%EA%B4%84%ED%98%B8%EB%B0%96%EC%9C%BC%EB%A1%9C-%ED%83%AD%ED%82%A4%EB%A1%9C-%EB%82%98%EA%B0%80%EA%B8%B0/

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 업무에서 자바를 다루게 되어서 급하게 자바를 공부하게 되었습니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


1. 자바의 자료형

 

지난 시간에 이어서 배열 자료형들을 공부해보겠습니다. 오늘도 자주 쓸만한 자료형들만 알아보고 넘어가도록 하겠습니다.

 

1) 숫자 (byte, short, long, int, float, double)
2) 문자 (char, String, StringBuffer)
3) 불 (boolean)
4) 배열 (Array)
5) 리스트 (ArrayList)
6) 맵 (Map)
7) 집합 (Set)
8) 상수집합 (Enum)

 

4) 배열 (Array)

 

자바의 배열은 아래와 같이 지난 시간 배웠던 자료형에 대괄호 [ ]를 붙여서 표현합니다.

 

즉, int[ ]는 int 객체들을 꾸러미로 가질 수 있는 Array 객체이며, String[ ]는 String 객체들을 꾸러미로 가질 수 있는 Array 객체입니다. (객체의 개념은 아직 어려운 개념일 수 있으니, 코드가 이렇게 생겼구나라고 생각하고 넘어가셔도 좋습니다.)

 

public class Datatype {

	public static void main(String[] args) {
				
		int[] numbers = {1,2,3,4,5};
		String[] strings = {"월","화","수","목","금","토","일"};
		
		System.out.println(numbers);
		System.out.println(strings);
	}
}

 

위의 String[] strings = {"월","화","수","목","금","토","일"} 코드는 아래와 같이 먼저 Array 객체를 생성해주고 그 값들을 하나씩 대입해주는 방식으로도 표현 가능합니다.

String[] strings = new String[7];
strings[0] = "월";
strings[1] = "화";
strings[2] = "수";
strings[3] = "목";
strings[4] = "금";
strings[5] = "토";
strings[6] = "일";

 

여기서 String[7]이라고 표현해준 부분을 보시면, Array 객체는 필요한 공간의 갯수를 딱 정해놓고 내용을 채워넣는 다는 것을 알 수 있습니다. 이러한 특징은 C언어와 같고 파이썬과는 다른 부분이네요.

 

참고로 "금"이라는 문자열을 출력하고 싶다면, 아래와 같이 코딩 하시면 됩니다.

// 인덱싱 개념
System.out.println(strings[4]);

 

 

5) 리스트 (ArrayList)

 

리스트는 배열과 비슷하면서도 편리한 점이 많은 자료형입니다. 앞서 공부했던 배열은 공간의 크기가 정해져서 변하지 않았다면 리스트는 그 크기가 정해져있지 않고 변한다는 것이 가장 큰 특징입니다.

 

쉽게 말해서 무언가 담는 그릇이 있는데, 배열은 딱딱한 그릇이고, 리스트는 늘어나는 소재의 그릇이라고 할 수 있겠네요.

 

// ArrayList를 사용하려면 아래의 클래스를 import 해주어야 함
import java.util.ArrayList;

public class Datatype {
    public static void main(String[] args) {
    	
        ArrayList season = new ArrayList();
        
        season.add("Spring");
        season.add("Autumn");
        season.add("Winter");
        
        System.out.println(season);
    }
}

 

<실행 결과>

[Spring, Autumn, Winter]

 

add

자, 여기서 제가 실수로 Summer를 빠트렸다고 해봅시다. 이럴 때 두번째, 즉 Spring과 Autumn 사이에 Summer를 넣고 싶다면 어떻게 해야 할까요?

 

season을 출력해보기 전에 아래의 코드를 Winter 아래에 넣어보세요.

season.add(1,"Summer");

 

<실행 결과>

[Spring, Summer, Autumn, Winter]

 

get, size, remove

만약  리스트 내에서 요소 하나만 출력하고 싶을 때, 리스트 내의 요소 갯수를 출력하고 싶을 때, 요소 하나를 없애고 싶을 땐 다음과 같이 하시면 됩니다.

// 하나만 선택해서 출력
System.out.println(season.get(3));

// 리스트 안에 담긴 요소들의 갯수 출력
System.out.println(season.size());

// 하나만 선택해서 삭제 (둘다 모두 삭제되지만 return 결과가 조금씩 다름)
System.out.println(season.remove("Autumn"));
System.out.println(season.remove(2));

 

하나씩 실행 시켜보면서 확인해보시면 이해하시는데에 도움이 되실거예요.

 

 

6) 맵 (map)

 

 

자바의 맵 자료형은 아래 표와 같이 Key와 Value 한 쌍으로 이루어진 요소들을 객체로 가지는 자료형입니다.

파이썬에서의 dictionary 자료형과 같은 개념입니다.

 

자바에서 map은 아래와 같이 만들 수 있습니다. 참고로 HashMap 객체를 사용해서 map을 만들어줄 때, 지금까지 못보던 <>가 들어가는 것을 볼 수 있는데 이는 "제네릭스" 문법으로 추후에 시간을 내서 공부해보겠습니다.

import java.util.HashMap;

public class Datatype {
    public static void main(String[] args) {
    	
        HashMap<String, String> map = new HashMap<>();
        map.put("남자", "Male");
        map.put("여자", "Female");
        
        System.out.println(map);
    }
}

 

<실행 결과>

{여자=Female, 남자=Male}

순서는 나중에 추가해주는 요소가 앞으로 오네요.

 

get, size, remove

map 역시 list와 마찬가지로 get, size, remove 메소드를 사용할 수 있습니다.

// key를 선택해서 value값을 출력
System.out.println(map.get("남자"));    //"Male" 출력

// 맵 안에 담긴 요소들의 갯수 출력
System.out.println(map.size());        // 2 출력

// key를 선택해서 key,value 세트를 삭제  --> 삭제 후 value값 리턴
System.out.println(map.remove("여자"));    // "Female" 출력

 


<참고 자료>

 

1. 점프 투 자바_위키독스

https://wikidocs.net/276

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 업무에서 자바를 다루게 되어서 급하게 자바를 공부하게 되었습니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


1. 프로그래밍에서 자료형의 의미

 

지난 시간까지 자바로 프로그래밍을 할 개발환경을 구축해보았다면, 이제부터는 제대로 자바 언어를 공부할 차례입니다.

 

그전에 프로그래밍이 정확히 무엇인지 알고 갈 필요가 있습니다.

 

우리에게 TV 프로그램이란 단어로 익숙한 프로그램의 사전적 의미는 지시 사항들이 나열된 순서를 의미합니다.

즉, 프로그래밍이란 특정 작업을 수행하는 일련의 명령들을 만드는 행위를 뜻합니다.

 

출처. 프로그래머가 필요한 수학 (brunch)


위의 그림에서 프로그램은 f(x)입니다. 빵 만드는 기계를 일종의 빵을 만드는 프로그램으로 볼 수 있죠.

 

프로그래밍(Programing)을 한마디로 f(x)를 구현하는 것입니다. 참고로 코딩(Coding)은 이러한 f(x)를 컴퓨터가 알아들을 수 있는 코드로 작성하는 행위를 뜻하죠.

 

이때, f(x)를 설계하면서 반드시 고려해야할 부분은 '어떤 입력값 a를 함수에 넣어 어떤 출력값 f(a)를 받을 것인지'입니다.

여기서 입력값과 출력값의 형태를 자료형이라고 설명 드릴 수 있습니다. 그 형태가 숫자면 숫자 자료형, 문자열이면 문자열 자료형이죠.

 

우리는 자료형에 대해 파악하고, 우리가 혹은 남이 만들어 놓은 함수 f(x)에 적절한 자료형을 넣어줄 필요가 있습니다. 물론 처리된 자료형을 다시 어떤 함수로 넣어주어야 하니 어떤 자료형이 나오는지도 잘 파악해야하죠.

 

위의 그림에서 만약 빵 만드는 기계에 밀가루 대신에 시멘트 가루를 넣으면 기계가 망가지겠죠?

그래서 우리는 무엇보다 먼저 자료형에 대해 공부할 필요가 있습니다.

 

 

2. 자바의 자료형

 

자바에는 다음과 같이 많은 종류의 자료형들이 있습니다. 하지만 이 많은 것들을 처음부터 하나하나 자세히 다루기엔 너무 재미가 없으니 필수적인 것들만 알아보고 넘어가도록 하겠습니다.

 

1) 숫자 (byte, short, long, int, float, double)
2) 문자 (char, String, StringBuffer)
3) 불 (boolean)
4) 배열 (Array)
5) 리스트 (ArrayList)
6) 맵 (Map)
7) 집합 (Set)
8) 상수집합 (Enum)

 

1) 숫자

 

숫자 자료형에서 가장 많이 사용하는 것은 int와 double 두 가지 입니다. int는 정수, double은 실수를 표현할 때 사용합니다.

일단 다른 문법은 신경쓰지 마시고 자료형의 생김새와 출력 결과만 봐주세요.

 

public class Datatype {

	public static void main(String[] args) {
				
		int num1 = 10;
		double num2 = 1.0;
		
		System.out.println(num1);
		System.out.println(num2);
	}
}

 

<실행 결과>

10
1.0

 

 

<참고> 각 자료형의 메모리 크기와 데이터 표현 범위

출처. TCP 스쿨

 

2) 문자

 

문자 자료형은 크게 문자 하나만 나타내는 char와 문자 여러개를 나타내는 String으로 나뉩니다. (StringBuffe는 일단 생략)

 

여기서 주의하실 점은 2가지입니다.

 

하나. char는 작은따옴표(' ')로 표현하고, String은 큰따옴표(" ")로 표현

둘. 자료형 String의 가장 첫글자는 꼭 대문자로 표현

 

public class Datatype {

	public static void main(String[] args) {
				
		char a = 'x';
		String b = "yyyyyy";
		
		System.out.println(a);
		System.out.println(b);
	}
}

 

<실행 결과>

x
yyyyyy

 

3) 불 (Boolean)

 

참(true) 또는 거짓(false)의 값을 갖는 자료형을 불 자료형이라고 하며, boolean이라고 표기합니다.

불 자료형은 아래와 같이 비교연산을 통해 참/거짓의 판단 결과값을 대입 받습니다.

 

public class Datatype {

	public static void main(String[] args) {
				
		boolean a = 2>1;
		boolean b = 1==2;
		
		System.out.println(a);
		System.out.println(b);
	}
}

 

<실행 결과>

true
false

 

다음 시간에 이어서 남은 자료형에 대해서 공부해보겠습니다.

 

감사합니다.


<참고 자료>

 

1. 점프 투 자바_위키독스

https://wikidocs.net/276

 

2. JAVA 기본타입 강의_TCP스쿨

http://www.tcpschool.com/java/java_datatype_basic

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 업무에서 자바를 다루게 되어서 급하게 자바를 공부하게 되었습니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


이번 시간에는 워크스페이스, 프로젝트를 생성하고, HelloWorld를 출력하는 자바 소스 코드 파일, 클래스 등을 다루어 보도록 하겠습니다.

 

1. 이클립스 인터페이스 구성

 

먼저 이클립스의 화면 구성은 다음과 같습니다. 가장 처음 실행하면 패키지 탐색기, 코드 작성 영역, Outline, 콘솔창으로 나뉘어 있습니다.

 

패키지 탐색기 : 프로젝트, 패키지, 클래스 등을 관리하는 영역

코딩 작성 영역 : 소스 코드(.java)를 작성할 수 있는 영역

콘솔 : 코드 실행 결과를 보여주는 영역

Outline : 소스 코드의 문법적 요소를 시각적으로 보여주는 영역

 

저는 여기다가 디렉토리를 관리해주는 Navigator 창을 추가해서 사용하기로 하였습니다.

 

네이게이터를 처음 추가하면 아래와 같은 모습은 아닐거예요. 그럴 땐 창을 드래그 해서 패키지 탐색기 아래에 놓아주면 아래와 같은 모습이 됩니다.

 

 

2. 자바 프로젝트 생성

 

자바 코딩을 위해서 가장 먼저 해줄 것은 프로젝트를 생성하는 것입니다.

 

1) 아래 그림과 같이 File-New-Java Project를 클릭해주세요.

 

2) 클릭하시면 아래와 같은 창이 나옵니다. 설명을 따라서 워크스페이스를 설정하고, 프로젝트 이름과 형태를 설정해주시면 됩니다.

 

저는 아래와 같은 프로젝트 이름과 워크스페이스 경로를 설정해주었습니다. 

 

프로젝트 레이아웃은 두번째 옵션을 선택하였더니, 아래와 같은 형태로 프로젝트 폴더가 생성되었습니다.

네비게이터 창에서 확인 가능

 

3. 자바 클래스 생성

 

다음으로 해줄 일은 자바 클래스를 생성해주는 일입니다. 클래스(.class) 파일을 생성하면 자바 소스 코드 파일(.java)도 생성됩니다.

 

1) 방금 생성한 프로젝트 폴더를 우클릭해서 아래 그림과 같이 'Class'를 클릭해줍니다.

 

2) 클래스명을 입력해주고, 'public static void main(String[ ] args) 옵션을 체크 후, 'Finish'를 클릭해줍니다.

 

저의 경우엔 'HelloWorld'라는 이름으로 클래스를 생성해 주었고, 그 결과는 아래와 같습니다.

코드 작성 영역

 

4. Hello World 출력하기

 

마지막으로 "Hello World!!"를 출력해보겠습니다.

 

1) 일단 코드의 의미는 몰라도 아래와 같이 코드를 입력해봅시다.

public class HelloWorld {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Hello World!!");
	}
}

 

2) Run 버튼을 눌러서 실행시켜봅시다.

 

아래와 같은 창이 뜰 수 있는데 'OK'를 눌러줍니다.

 

<콘솔창 출력 결과>

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

1. 네이버 부스트코스 강의_쉽게 배우는 자바1

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 업무에서 자바를 다루게 되어서 급하게 자바를 공부하게 되었습니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


이번 시간에는 자바를 처음 접하면 자주 듣는 용어들의 개념을 명확히 이해하는 시간을 가져보겠습니다. 용어들을 공부하면서 자바의 구조에 대해서도 이해하실 수 있을거예요.

 

 

1. JVM이란?

 

가장 첫 시간에 자바의 장점에 대해서 이야기 할 때, 자바 가상 머신(JVM, Java Virtual Machine)을 사용하여, 운영체제와는 독립적으로 동작할 수 있다고 말씀드렸었습니다.

 

이 JVM을 설명 드리려면 그 전에 소스 코드와 바이트 코드의 차이에 대해서 이해하셔야 하는데요.

바이트 코드는 바이너리 코드라고도 부름

 

우리가 앞으로 배울 자바 문법을 이용해서 작성할 코드를 자바 소스 코드라고 합니다. 그 코드가 저장된 파일의 확장자는 .java이구요.

 

우리가 지난 시간에 선택했던 eclipse IDE에서는 코드를 작성하고 저장을 하면, 자동으로 자바 바이트 코드(.class) 파일이 생성되어 저장되는데요. 이 과정을 컴파일(Compile)이라 부르며 사람이 짠 코드를 컴퓨터가 알아들을 수 있는 코드로 변환되는 과정입니다.

 

정확히는 JVM이 알아들을 수 있는 코드이며, JVM은 이를 해석해서 실행시켜 주는 것입니다.

(참고로 Windows, Linux, Mac OS 마다 각각의 JVM이 있으며,  class 파일만 같다면 동일한 결과를 출력하게 됩니다.)

 

 

2. JRE와 JDK란?

 

JRE란 Java Runtime Environment의 약자로 자바 실행환경을 의미합니다. 아래 그림에서 보시는 것과 같이 방금 전 배웠던 JVM과 JVM이 동작하는데에 필요한 각종 자바 라이브러리를 의미합니다.

JVM, JRE, JDK의 관계 (출처.programiz.com)

 

마지막으로 가장 JRE에 컴파일러, 디버거, JavaDoc 등을 포함하는 개념이 가장 첫 시간에 설치했던 JDK(Java Development Kit)입니다.

 

 

3. 워크스페이스, 프로젝트, 패키지, 클래스의 관계

 

처음에 이클립스를 실행해서 강의를 따라서 Hello World가 출력되는 코드를 작성해보니, 좌측 Package Explorer에 많은 것들이 계층을 이루며 표현되어 있었습니다.

 

앞으로 코딩을 하기 위해서는 이런 구조들이 어떤 의미와 관계를 가지는지 파악해놓는게 좋겠다고 생각하여 좀 더 자세히 공부해보았습니다.

HelloWorld 프로젝트

 

이에 대한 내용이 아주 잘 정리된 블로그가 있어서 참고하였습니다. 너무 잘 정리해두셔서 별다른 설명이 필요 없을 것 같네요.

 

출처. https://codevang.tistory.com/76

 

원래는 이번 시간에 워크스페이스, 프로젝트를 생성하고, HelloWorld를 출력하는 자바 소스 코드 파일, 클래스 등을 다루어보려 했으나, 글이 길어질 듯해서 다음 글에서 다루어 보도록 하겠습니다.


<참고 자료>

 

1. 자바의 이식성-"바이트 코드"에서 "가상머신"까지_네이버 블로그(행복을 주는 공간)

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=web4click&logNo=110159692556 

 

2. 워크스페이스/프로젝트/패키지/클래스의 개념 및 명명규칙_티스토리 블로그(codevang)

https://codevang.tistory.com/76

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 업무에서 자바를 다루게 되어서 급하게 자바를 공부하게 되었습니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


 

1. IDE란?

 

파이썬을 공부할 때 IDE 관련 내용을 포스팅 한 적이 있는데, 그 내용을 다시 가져와 보았습니다.

 

IDE [Integrated Development Environment]

효율적으로 소프트웨어를 개발하기 위한 통합개발환경 소프트웨어 어플리케이션 인터페이스이다.

코드 편집기, 디버거, 컴파일러, 인터프리터 등을 포함하고 개발자에게 제공한다.

 

위의 설명을 저의 얕은 지식으로 보충 설명 하자면 아래와 같습니다.

 

코드 편집기

코드를 알록달록 예쁘게, 자동 완성, 자동 들여쓰기, 맞춤법 검사 등의 기능으로 코드 편집을 쉽게 해주는 역할

 

디버거

코딩을 할 때, 코드가 잘 돌아가는지, 변수에는 어떤 값이 들어가 있는지 모니터링 해주는 역할

 

컴파일러

작성된 코드 전체를 컴퓨터가 알아먹기 쉬운 언어(기계어)로 번역해서 작동시켜주는 역할

 

인터프리터

코드를 한 줄 한 줄 실핼시켜주는 역할

 

 

2. 자바용 IDE

 

파이썬용 IDE에도 여러가지(VS CODE, Pycharm, JupyterNotebook 등등)가 있듯이 자바용 IDE에도 여러가지가 있습니다.

보통 IDE를 한번 선정하면 익숙한 것을 계속 사용하려는 본능 때문에 쉽게 바꾸기가 어렵습니다. 그래서 저는 무엇을 사용할지 신중히 알아보았는데요.

 

아래의 글들을 참고해서 선정한 IDE는 Eclipse였습니다. 위의 말과는 조금 모순적일 수는 있지만 일단 기초문법을 모두 공부하고 제대로 자바를 다루기 전까지는 Eclipse를 사용해보고 추후에 다시 생각하기로 했습니다.

 

그 이유는 아래와 같습니다.

 

1) 무료다. (IntelliJ는 개인용은 2022년 기준. 연 149달러, 기업용은 499달러이며, 무료버전이 있지만 기능이 제한적)

2) 참고하고 있는 강의(네이버부스트코스- 쉽게 배우는 자바1)에서 Eclipse를 사용

 

https://ko.myservername.com/top-10-best-java-ides-online-java-compilers

 

상위 10 개 이상의 최고의 Java IDE 및 온라인 Java 컴파일러 [2021 순위] - 다른

가격 및 기능이 포함 된 상위 Java IDE 및 온라인 Java 컴파일러의 종합 목록 및 Compariosn. 이 목록에서 최상의 Java IDE 및 컴파일러를 선택하십시오.

ko.myservername.com

 

https://devuna.tistory.com/76

 

[IDE] 이클립스 인텔리제이 장단점 비교(eclipse/IntelliJ)

[IDE] 이클립스 인텔리제이 장단점 비교(eclipse/intelliJ) 1. 이클립스(eclipse) 역사가 오래되어 잘 작성된 문서, 수 많은 플러그인들이 존재하며 가장 대중적으로 사용되고 있는 IDE이다. 가장 큰 강

devuna.tistory.com

 

https://velog.io/@composite/Eclipse-VS-Intellij-IDEA-%EB%85%BC%EB%9E%80-%EC%A2%85%EA%B2%B0

 

Eclipse VS Intellij IDEA 논란 종결

반박시 국비.

velog.io

 

 

3. Eclipse 설치하기 (윈도우 기준)

 

1) 먼저 아래의 링크에 들어가줍니다.

 

https://www.eclipse.org/downloads/

 

Eclipse Downloads | The Eclipse Foundation

The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.

www.eclipse.org

 

2) 아래의 주황색 다운로드 버튼을 눌러줍니다.

 

3) 무슨 의도인지 모르겠지만 한번더 다운로드 버튼이 있는 화면이 나옵니다. 다시 다운로드 버튼을 눌러주세요.

 

4) 좌측 하단에 다운로드 완료된 설치파일을 클릭해줍니다.

 

5) 아래와 같은 창이 뜨면, 가장 상단의 "Eclipse IDE for Java Developers"를 클릭해줍니다.

 

6) 설치 경로를 정해주는 차례인데, 아무것도 건드리지 않고 "INSTALL" 버튼을 클릭해주세요.

 

7) 라이선스 관련 동의하는 부분입니다. "Accept Now"를 눌러주세요.

 

8) 설치가 시작됩니다. 잠시 기다려주세요.

 

9) 설치가 완료되면, "LAUNCH" 버튼을 클릭해서 Eclipse를 실행시켜주세요.

 

10) 기본 작업경로를 설정하는 부분인데, 기본으로 입력되어 있는 경로 그대로 "Launch" 버튼을 클릭해주세요. (나중에 변경할 수도 있는 것으로 보입니다.)

 

11) 아래와 같은 창이 잠시 떴다가 "eclipse-workspace - Eclipse IDE" 창이 뜨면 제대로 설치가 완료된 것입니다.

 

오늘은 자바용 IDE는 무엇이 있는지 알아보고, 그 중에서 Eclipse를 선택해서 설치까지 해보았습니다.

 

다음 시간에는 프로그래밍 언어를 배울 때 가장 기본중의 기본인 "Hello World"를 출력해보면서 자바의 실행 메커니즘에 대해서 공부해보겠습니다.


 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

지금까지 파이썬 위주로 포스팅을 해왔는데, 제가 업무에서 자바를 다루게 되어서 급하게 자바를 공부하게 되었습니다.

 

저도 자바 왕초보인 만큼 글에 부족함이 많을 수 있으니 미리 양해부탁드립니다!

 

 


 

1. 자바란?

자바(Java)는 C언어에 객체 지향적 기능을 추가하여 만든 C++과는 달리, 처음부터 객체 지향 언어로 개발된 프로그래밍 언어입니다. 비슷한 언어로는 MS에서 개발한 C#이 있다고 합니다. 여담이지만 C++에서 ++을 두개 더 붙여서 #이 되었다고 하네요.

 

자바의 가장 큰 특징은 자바 가상 머신(JVM, Java Virtual Machine)을 사용하여, 운영체제와는 독립적으로 동작할 수 있다는 것입니다. 즉, Windows, Linux, Mac 어느 운영체제에서도 동일한 코드로 실행이 가능하다는 것입니다.

 

바로 이러한 점 때문에 자바는 2022년 현재 가장 인기있는 언어 Top3에 랭크하고 있습니다.

 

출처. TIOBE

 

2. JDK 설치

JDK는 Java Development Kit로 자바 소프트웨어 개발을 위한 여러 도구의 구성을 의미하며, 자바를 설치한다는 것은 JDK를 설치하는 것과 동일합니다.

 

자바는 2022년 기준 18버전까지 나와 있으며 저는 LTS(장기 지원) 릴리스인 17버전을 설치하였습니다.

 

설치방법

1) 구글에서 java download를 검색해서 가장 상단의 "자바 다운로드 | 오라클"을 클릭합니다. 

 

2) 아래의 사진에 빨간색 사각형으로 표시한 부분을 순서대로 클릭하여, exe 파일을 다운로드 해줍니다. (Windows 기준)

 

3) 다운로드가 완료되면 클릭하여 설치파일을 실행합니다.

 

4) 그림을 따라서 버튼들을 클릭해줍니다.

 

3. JDK 설치 여부 확인

필수는 아니지만 자바가 잘 설치되었는지 확인해보겠습니다.

 

1) 윈도우키와 R키를 함께 누르면 아래와 같은 실행 창이 뜹니다. 입력창에 cmd라고 입력하고 확인을 눌러줍니다.

 

2) java -version을 입력고 엔터를 누르면 아래와 같이 java의 버전 정보가 출력됩니다.

 


<참고 자료>

 

1. 네이버 부스트코스 강의_쉽게 배우는 자바1

 

2. 자바의 정석_3rd Edition

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

지난 시간에 파이썬 코드를 이용해서 Gmail에 메일을 보내는 방법에 대해서 공부해 보았다면, 이번 시간에는 받은 메일을 읽는 방법을 공부해보겠습니다.

 

이번 시간 역시 Gmail을 파이썬으로 사용하기 위해서는 '앱 비밀번호'가 필요합니다.

 

만약 구글에서 '2단계 인증'과 '앱 비밀번호' 설정을 함께 진행하지 않으셨다면 지난 글을 보시고 설정을 마치신 후에 이번 강의를 따라와 주세요!

 

2022.03.17 - [파이썬 패키지/이메일] - [python/smtplib] 파이썬으로 구글 Gmail 보내기 1편. SMTP의 개념과 구글 앱 비밀번호 발급받기

 

 


1.  imaplib 모듈 불러오기

 

가장 먼저 해줄 일은 imaplib 모듈을 import 해주는 것입니다. imaplib 역시 smtplib 모듈과 같이 파이썬 내장 라이브러리에 포함된 모듈로 별도의 설치가 필요 없답니다.

import imaplib

 

2.  imap 객체 생성

 

다음으로는 Gmail 메일의 imap 서버의 url 정보를 입력하고 server라는 이름의 변수에 담아줍니다.

imap = imaplib.IMAP4_SSL('imap.gmail.com')

 

3.  imap 서버에 로그인

 

이제 메일 정보를 입력해줍시다. 여기서 지난 시간에 발급받은 "앱 비밀번호"가 필요해요. 만약 error: b'[ALERT] Application-specific password required 라는 오류가 출력된다면 그건 평소 사용하시던 비밀번호를 입력하셨기 때문일거예요.

# imap.login('메일 주소', '비밀번호')
imap.login('xxxxx@gmail.com', '지난 시간 받았던 16자리 앱 비밀번호')

 

4.  사서함 선택

 

전체편지함을 선택하기 위해서는 아래의 코드가 필요합니다. 사서함을 선택하는 코드라고 하는데, 만약 사서함을 여러개로 분류해서 사용한다면 해당 사서함의 이름을 'INBOX' 대신 입력하면 되지 않을까 생각됩니다. (실제로 해보진 않았답니다!) 

# 사서함 선택, 반환 데이터는 mailbox에 있는 메시지 수
imap.select("INBOX")

 

5.  이메일 선택

 

사서함에서 가장 최신에 받은 메일을 참조하기 위해서는 아래와 같은 코드를 실행해줍니다. 이때 uid라는 함수를 사용해서 각 메일에 고유의 번호를 부여해서 인덱싱 할 수 있습니다. 세부적으로 코드가 어떻게 작동하는지 알고 싶으신 분들은 코드를 한줄 한줄 실행하면서 print( ) 함수로 출력해 보시는 걸 추천드립니다.

# 사서함의 모든 메일의 uid 정보 가져오기
# 만약 특정 발신 메일만 선택하고 싶다면 'ALL' 대신에 '(FROM "xxxxx@naver.com")' 입력
status, messages = imap.uid('search', None, 'ALL')

messages = messages[0].split()

# 0이 가장 마지막 메일, -1이 가장 최신 메일
recent_email = messages[-1]

 

저는 저의 네이버 메일을 이용해서 아래와 같이 '코딩유치원 화이팅!'이라는 제목으로 메일을 보냈고, 이 메일이 최신 메일인 상태입니다.

 

6.  선택한 메일의 내용 가져오기

 

선택한 메일(여기서는 가장 최신의 메일)의 내용을 사람이 읽을 수 있는 형태로 바꾸어 줍니다. decode하기 전의 내용이 궁금하시다면 raw를 print( ) 함수로 출력해보세요.

# fetch 명령어로 메일 가져오기
res, msg = imap.uid('fetch', recent_email, "(RFC822)")

# 사람이 읽을 수 있는 없는 상태의 이메일
raw = msg[0][1]

# 사람이 읽을 수 있는 형태로 변환
raw_readable = msg[0][1].decode('utf-8')

 

7.  선택한 메일의 내용 파싱하기

 

파싱이란 복잡하게 흩어진 정보에서 원하는 정보만 추출하는 것을 말합니다. 이때는 지난 시간에 메일을 보낼 때 사용했던 email 모듈을 여기서도 사용합니다. 메일 내용을 확인 하는 부분이 조금 복잡한데 이에 대한 내용은 여기서는 자세히 다루지 않겠습니다.

 

궁금 하신 분들은 글 마지막의 점프 투 파이썬 - 라이브러리 예제 편 (POP3) 링크를 참조하시면 설명이 잘 되어 있습니다.

 

import email

# raw_readable에서 원하는 부분만 파싱하기 위해 email 모듈을 이용해 변환
email_message = email.message_from_string(raw_readable)

from email.header import decode_header, make_header

# 보낸사람
fr = make_header(decode_header(email_message.get('From')))
print(fr)

# 메일 제목
subject = make_header(decode_header(email_message.get('Subject')))
print(subject)

# 메일 내용
if email_message.is_multipart():
    for part in email_message.walk():
        ctype = part.get_content_type()
        cdispo = str(part.get('Content-Disposition'))
        if ctype == 'text/plain' and 'attachment' not in cdispo:
            body = part.get_payload(decode=True)  # decode
            break
else:
    body = email_message.get_payload(decode=True)
    
body = body.decode('utf-8')
print(body)

 

<최종 실행 결과>

<실제 메일>

 

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.

 


<참고 자료>

 

1. imaplib 공식 문서

https://docs.python.org/ko/3/library/imaplib.html

 

2. 점프 투 파이썬 - 라이브러리 예제 편 (imaplib)

https://wikidocs.net/130371

 

3. 점프 투 파이썬 - 라이브러리 예제 편 (pop3)

https://wikidocs.net/130215

 

반응형

+ Recent posts