본 글은 (주)인실리코젠 이병준 주임님과 이수호 주임님께서 제공해주신 문제에 대한 풀이 과정입니다.
문제
[네이버 IT 뉴스 읽어서 출력 및 저장하기]
-뉴스 범위 : 최근 1주일간 각각 1페이지 목록
1. 뉴스 정보(타이틀, 내용, 언론사명, 몇분전) cmd 출력하기
2. 뉴스 타이틀을 파일 제목으로 이미지 다운로드하기(경로 자유)
학습했으면 하는 내용
- html 태그
- selector
- 파일 입출력
Target URL : https://news.naver.com/main/list.naver?mode=LS2D&sid2=230&mid=shm
크롤링을 위해서 타겟 url의 개발자 도구를 열어 어떻게 구성되어 있는지 파악해 보았다.
각 태그를 열어 마우스를 가져다가 올려보니 해당 태그에 감싸지는 코드가 존재한다면 화면에 표시가 되었다. 이를 따라가서 끝까지 열어본 결과 기사들은 <tbody> ... </tbody> 안에 속한다는 것을 알게되었다.
headline 기사와 normal 기사로 나뉘어 진다.
newsflash_body 클래스 안에 type06_headline ul 태그와 type06 ul 태그로 두 몸체가 나뉘어져 있는 것을 볼 수 있다.
내부까지 들여다보면 아래와 같다.
태그의 구성을 확인해보자.
.. tbody -> td : content -> div list_body newsflash_body -> ul : type06_headline -> li -> dl -> dd -> span class : ~~~
의 구성으로 되어있다.
그렇다면 태그의 구성을 Selector의 경로로 어떻게 파악할 수 있을까?
답은 의외로 간단하다. 경로를 알고 싶은 태그에 우클릭을 한 후 selector 경로 복사를 하면 된다.
뉴스 제목에 대한 태그 경로는 아래와 같다.
#main_content > div.list_body.newsflash_body > ul.type06_headline > li:nth-child(1) > dl > dt:nth-child(2) > a
- 하나 하나 파악해보자.
- #main_content : html 내 id가 #main_content 인 요소를 나타냄
- : #main_content의 직계 자식으로 나오는 요소 선택
- div.list_body.newsflash_body : div 태그 중 class가 list_body 이면서 newsflash_body인 요소를 나타냄
- ul.type06_headline : ul 태그 중 class가 type06_headline인 요소를 나타냄
- li:nth-child(1) : ul 안에서 첫 번째 li 요소를 나타냄
- dl : 정의 목록을 나타내는 dl 태그 선택
- dt:nth-child(2) : dl 안에서 두 번째 dt 요소를 선택
- a : 링크를 나타내는 태그 선택
또한 기사 제목, 요약 내용, 언론사 명, 업로드 시기, 이미지 url은 모두 공통의 경로를 가진다.
public static String tag = "#main_content > div.list_body.newsflash_body";
공통된 경로는 따로 변수로 빼두어 정의하였다.
public static String news_url = "https://news.naver.com/main/list.naver?mode=LS2D&sid2=230&mid=shm";
뉴스 경로에 해당되는 코드이다.
try {
Document doc = Jsoup.connect(news_url).get(); // url 파싱
db DatabaseManager = new db(); // db 연동 객체 선언
Element body = doc.selectFirst(tag); // 태그 몸체
// headline 기사 추출
Elements headlineElements = body.select("ul.type06_headline > li");
printArticleInfo("headline", headlineElements);
// 일반 기사 추출
Elements normalElements = body.select("ul.type06 > li");
printArticleInfo("normal", normalElements);
...
}
- JSOUP 라이브러리를 사용하여 주어진 url에서 html을 가져와 Document 객체로 파싱
- HTML에서 원하는 부분 선택: Jsoup을 사용하여 HTML 문서에서 필요한 부분을 선택
- body.selectFirst(tag); 를 통해서 주어진 선택자에 해당하는 첫 번째 엘리먼트를 가져옴
- 헤드라인 기사와 일반 기사를 추출
첫 번째 라인에 Document doc = Jsoup.connect(news_url).get(); 에서 Jsoup 이라는 놈을 사용한다.
Jsoup이란?
HTML 파싱 JAVA 라이브러리이다. DOM, CSS 및 jqeury와 같은 방법을 사용하여 데이터를 추출하고 조작하는 API 제공
Maven에는 아래와 같이 적용된다.
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
pom.xml에 의존성을 추가하면 왼쪽처럼 자동으로 Maven Dependencies에 추가된다.
사용되는 Document , Element 등은
모두 Jsoup에서 제공되는 객체들이다.
본론으로 돌아와서 printArticleInfo() 에 대해서 알아보자.
해당 함수는 태그를 통해 받아오는 경로에 추가적인 경로를 더해 크롤링을 진행하고 필요한내용을 저장하고 출력한다.
private static void printArticleInfo(String category, Elements elements) {
System.out.println("[" + category + " 기사]");
for (Element element : elements) { // elements로 받아와서 element에 입력
String title = element.select("dl > dt:nth-child(2) > a").text();
String content = element.select("dd > span.lede").text();
String publisher = element.select("dd > span.writing").text();
String upload = element.select("dd > span.date").text();
System.out.println("기사 제목: " + title);
System.out.println("기사 내용: " + content);
System.out.println("기사 출처: " + publisher);
System.out.println("기사 업로드: " + upload);
Element imageElement = element.selectFirst("dl > dt.photo img"); // 이미지는 따로 추출
if (imageElement != null) {
String imageUrl = imageElement.attr("src"); // imageElement 에서 src 속성을 추출하여 imageUrl 저장
System.out.println("이미지 경로: " + imageUrl);
info i = new info(title,content,publisher,upload,imageUrl);
list.add(i);
} else {
System.out.println("이미지가 없습니다.");
String imageUrl = "";
info i = new info(title,content,publisher,upload,imageUrl);
list.add(i);
}
System.out.println("------------------------");
}
}
조금은 난잡해 보일 수 있다. 하지만 하나 하나 뜯어보면 그리 어렵지 않은 코드이다.
매개변수로 받아오는 Category는 헤드라인 기사인지 일반 기사인지 나타낸다. elements에 위에서 언급한 공통된 경로를 가져온다. 이에 더해 각 내용에 해당되는 경로를 추가하여 필요한 정보들을 추출한다.
이미지의 경우 기사에 이미지가 없는 경우도 있기 때문에 if-else 문으로 나누어 예외 상황이 발생하지 않도록 하였다.
크롤링하여 받아오는 정보들은 info 객체에 저장하여 ArrayList로 관리하도록 하였다.
지금까지의 코드를 실행해보면 아래와 같은 실행 결과를 같게 된다. 출력이 길기 때문에 접은글로 표현하였다.
[headline 기사]
기사 제목: [에듀플러스]〈칼럼〉대학의 벽을 허물어야 한다
기사 내용: 때는 바야흐로 입시의 계절이다. 대학입시에서 우수한 학생들이 자연계나 공학계열 학과를 기피하며, 적성에 관계없이 무조건 의대, …
기사 출처: 전자신문
기사 업로드: 1분전
이미지 경로: https://imgnews.pstatic.net/image/origin/030/2024/01/16/3173740.jpg?type=nf106_72
------------------------
기사 제목: 고진 디플정위원회 위원장 “정부 정보화 사업, 클라우드 네이티브로 혁신 이어간다”
기사 내용: “디지털플랫폼정부 허브를 민간 클라우드에 구축해 민간 기업의 디지털 역량, 혁신 기술, 아이디어를 정부시스템에 접목하고 있습니다 …
기사 출처: 전자신문
기사 업로드: 1분전
이미지 경로: https://imgnews.pstatic.net/image/origin/030/2024/01/16/3173739.jpg?type=nf106_72
------------------------
기사 제목: [에듀플러스]의학계열 분석〈1〉서울대, 의·치·약·수·간호대 330명 모집 “수시 선발 64.5%…의예과 수시 1.09등급, 정시 99.5↑”
기사 내용: 대한민국 입시의 가장 핫 이슈는 의대열풍이다. 에듀플러스는 종로학원과 공동기획으로 이공계 기획 4탄 '전국 의학계열 대학 집중 …
기사 출처: 전자신문
기사 업로드: 1분전
이미지 경로: https://imgnews.pstatic.net/image/origin/030/2024/01/16/3173738.jpg?type=nf106_72
------------------------
기사 제목: 오픈AI, 허위 선거 정보 예방 기능 강화
기사 내용: 2024년은 수퍼 선거의 해다. 지난 13일 대만 총통 선거를 시작으로 우리나라는 물론이고 미국, 인도네시아, 인도 등에서 대선 …
기사 출처: 전자신문
기사 업로드: 1분전
이미지 경로: https://imgnews.pstatic.net/image/origin/030/2024/01/16/3173737.jpg?type=nf106_72
------------------------
기사 제목: 환경부 "반도체 메가 클러스터 물 공급 차질없게 선제 대응"
기사 내용: 용인 클러스터에만 2050년 대구시 사용량과 맞먹는 물 필요 하수재이용수·화천댐 발전용수 활용…수도시설 확충도 환경부가 경기 용 …
기사 출처: 연합뉴스
기사 업로드: 2분전
이미지 경로: https://imgnews.pstatic.net/image/origin/001/2024/01/16/14447414.jpg?type=nf106_72
------------------------
기사 제목: 벤츠CTO "모든분야서 AI 적용…티맵, 이르면 올해 E클래스 적용"
기사 내용: 'CES 2024' 국내 미디어 간담회…자율주행 위해 각국 법규 통일 강조 "한국, 벤츠에 아주 중요한 나라…한국 기술 면밀히 …
기사 출처: 연합뉴스
기사 업로드: 2분전
이미지 경로: https://imgnews.pstatic.net/image/origin/001/2024/01/16/14447413.jpg?type=nf106_72
------------------------
기사 제목: 메타넷티플랫폼, 보안관제 전문기업 신규 지정
기사 내용: 메타넷티플랫폼은 과학기술정보통신부로부터 보안관제 전문기업으로 신규 지정됐다고 16일 밝혔다. '보안관제 전문기업' 지정제도는 국 …
기사 출처: 디지털타임스
기사 업로드: 3분전
이미지 경로: https://imgnews.pstatic.net/image/origin/029/2024/01/16/2849764.jpg?type=nf106_72
------------------------
기사 제목:
기사 내용: ▲박강웅씨 별세, 박정환(인천일보 편집국장)씨 부친상=16일, 충남 서산시 우리요양병원장례식장 특실 국화실, 발인 18일. (0 …
기사 출처: 전자신문
기사 업로드: 3분전
이미지가 없습니다.
------------------------
기사 제목: 수리硏-광주시립미술관, ‘수학+예술’ 대중화 맞손
기사 내용: 국가수리과학연구소는 광주시립미술관과 수학과 예술 분야 등의 협력을 통해 관련 분야 활성화 및 전문성을 강화하고 다양한 콘텐츠를 …
기사 출처: 헤럴드경제
기사 업로드: 9분전
이미지 경로: https://imgnews.pstatic.net/image/origin/016/2024/01/16/2252985.jpg?type=nf106_72
------------------------
기사 제목: “다들 속았다” 사먹는 ‘생수’, 수돗물보다 더러울 줄이야 [지구, 뭐래?]
기사 내용: “왜 수돗물을 마셔요?? 문제가 없다고 해도 굳이 마실 필요가 있나요. 찝찝하게.” 수돗물 마시는 데 대한 인식이다. 수돗물 대 …
기사 출처: 헤럴드경제
기사 업로드: 10분전
이미지 경로: https://imgnews.pstatic.net/image/origin/016/2024/01/16/2252983.jpg?type=nf106_72
------------------------
[normal 기사]
기사 제목: 위메이드, 위믹스 블록체인 협력사로 베리체인스 영입
기사 내용: 위메이드(112040)는 16일 자사 블록체인 플랫폼 위믹스3.0의 노드 카운슬 파트너인 '40원더스(Wonders)'에 베리체 …
기사 출처: 뉴스1
기사 업로드: 16분전
이미지 경로: https://imgnews.pstatic.net/image/origin/421/2024/01/16/7293621.jpg?type=nf106_72
------------------------
기사 제목: ‘내 남편과 결혼해줘’ 흥행에 네이버웹툰 방긋…영상화 수혜 ‘톡톡’
기사 내용: 드라마 ‘내 남편과 결혼해줘’ 인기가 원작 역주행으로 이어지고 있다. 네이버웹툰은 드라마 ‘내 남편과 결혼해줘’ 공개 후 원작 …
기사 출처: 이코노미스트
기사 업로드: 18분전
이미지 경로: https://imgnews.pstatic.net/image/origin/243/2024/01/16/55253.jpg?type=nf106_72
------------------------
기사 제목: '바레인전 멀티골' 이강인, KT와 함께 '갤럭시S24' 홍보
기사 내용: KT, 이강인 선수와 후원 재계약 축구 국가대표 이강인 선수(파리 생제르맹)가 KT와 함께 갤럭시 신모델을 홍보한다. KT는 이 …
기사 출처: 더팩트
기사 업로드: 33분전
이미지 경로: https://imgnews.pstatic.net/image/origin/629/2024/01/16/261041.jpg?type=nf106_72
------------------------
기사 제목: 수출로 눈 돌린 K게임…전체 매출 절반 해외서[산업 덮친 인구소멸]
기사 내용: “15년 전, 이대로 간다면 10년 내로 게임사 대부분이 망할 것으로 봤습니다.” 오랜 기간 게임업계에 몸담고 있는 한 게임사 …
기사 출처: 아시아경제
기사 업로드: 33분전
이미지 경로: https://imgnews.pstatic.net/image/origin/277/2024/01/16/5367740.jpg?type=nf106_72
------------------------
기사 제목: 신상진 성남시장 "판교 AI 반도체 R&D 허브 조성 정부 발표 환영"
기사 내용: 신상진 성남시장은 16일 정부가 성남 판교를 비롯해 수원과 평택 등 경기 남부의 반도체 기업과 관련 기관이 밀집한 지역 일대를 …
기사 출처: 뉴스1
기사 업로드: 39분전
이미지 경로: https://imgnews.pstatic.net/image/origin/421/2024/01/16/7293531.jpg?type=nf106_72
------------------------
기사 제목: 네이버 ‘치지직’ 영토 확장…e스포츠 구단 ‘농심 레드포스’ 합류
기사 내용: 네이버가 게임 특화 스트리밍 서비스 ‘치지직’의 영역을 지속 확장하고 있다. 네이버는 농심 레드포스와 파트너십을 체결했다고 16 …
기사 출처: 이코노미스트
기사 업로드: 41분전
이미지 경로: https://imgnews.pstatic.net/image/origin/243/2024/01/16/55252.jpg?type=nf106_72
------------------------
기사 제목: 삼성, 초연결 지원 '엑시노스 커넥트 U100' CES 2024 혁신상 수상
기사 내용: 삼성전자 무선통신 반도체 '엑시노스 커넥트 U100'이 세계 최대의 가전·IT 전시회 CES 2024에서 혁신상을 수상했다. 해 …
기사 출처: 지디넷코리아
기사 업로드: 44분전
이미지 경로: https://imgnews.pstatic.net/image/origin/092/2024/01/16/2318232.jpg?type=nf106_72
------------------------
기사 제목: 올해 다보스포럼 최대 이슈는 암호화폐가 아니라 OO
기사 내용: 최근 몇 년간 세계경제포럼(WEF)인 다보스포럼의 가장 큰 주제는 암호화폐(가상화폐)였다. 그러나 올해는 암호화폐 대신 생성형 …
기사 출처: 뉴스1
기사 업로드: 47분전
이미지 경로: https://imgnews.pstatic.net/image/origin/421/2024/01/16/7293509.jpg?type=nf106_72
------------------------
기사 제목: 약국이 병?의원 유치 위해 인테리어 등 혜택 제공시 자격정지 등 처벌
기사 내용: 약국이 건물에 병?의원 유치를 위해 인테리어 등 편익을 제공하는 경우 앞으로는 제공한 약사나, 제공받은 의사 모두 처 …
기사 출처: 지디넷코리아
기사 업로드: 53분전
이미지 경로: https://imgnews.pstatic.net/image/origin/092/2024/01/16/2318230.jpg?type=nf106_72
------------------------
기사 제목: 클리노믹스, 게놈 블록체인 NFT 특허 기술 등록
기사 내용: 게놈(유전자) 분석 전문기업 클리노믹스(352770)는 블록체인과 NFT 기술을 활용한 새로운 게놈 기반 비즈니스 영역을 개척하 …
기사 출처: 이데일리
기사 업로드: 55분전
이미지 경로: https://imgnews.pstatic.net/image/origin/018/2024/01/16/5655802.jpg?type=nf106_72
------------------------
이제 이미지를 폴더에 저장하는 코드를 작성해야한다.
다양한 방법이 있겠지만 필자는 좀 더 쉽게 파일에 저장하기 위해 절대 경로를 사용하였다.
public static String destinationFolder = "C:\\Users\\kih25\\OneDrive\\바탕 화면\\Test\\crolling\\image"; // 절대 경로 사용
먼저 경로를 지정할 변수를 선언한다. 그 다음 파일 입출력에 사용할 라이브러리를 import 한다.
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
파일 입출력에 대한 코드는 다방면으로 검색을 통해서 여러 방식을 알아보았고 가장 필자와 잘 맞는 입출력 방식을 선택하였다.
이미지를 폴더에 저장하는 코드는 아래와 같다.
private static void downloadImage(String imageUrl, String destinationFolder, String title) {
try {
URL url = new URL(imageUrl); // url 객체 생성
// 이미지 다운로드
try (InputStream in = url.openStream()) { // url로 파일 스트림 open
// 파일 저장 경로 설정
String fileName = imgCount + ".jpg";
imgCount++;
Path destinationPath = Paths.get(destinationFolder, fileName); // 경로 정의
// 이미지 저장
// 이미 파일이 존재하면 덮어쓰기 옵션을 사용
Files.copy(in, destinationPath, StandardCopyOption.REPLACE_EXISTING);
}
} catch (IOException e) {
e.printStackTrace();
}
}
중점으로 봐야할 내용은 try (InputStream in = url.openStream()) 해당 부분이다.
try 하면 catch 혹은 finally 가 와야 하는데 뭔가 특이하다. 해당 구문은 try-with-resources 로try-catch-finally의 단점을 보완한 문법이다. Java는 AutoCloseable 인터페이스를 구현하고 있는 자원에 대해 try-with-resources를 적용 가능하도록 하였고, 이를 사용함으로써 코드가 유연해지고, 누락되는 에러없이 모든 에러를 잡을 수 있게 되었다.
try-with-resources를 통해서 에러 스택에 대한 반납 걱정을 하지 않아도 된다. 누락없이 모든 자원을 반납하기 때문이다. 또한 에러에 대한 스택 트레이스를 남길 수 있어 에러 로그 찾기에도 편리한 문법이다.
해당 내용을 추가하여 실행해보면 경로로 지정해둔 폴더에 다음과 같이 이미지들이 저장된다.
이미지가 잘 저장되는 것을 확인할 수 있다.
여기까지가 주어진 문제에 대한 해결 과정이다.
추가적으로 ArrayList 객체에 저장된 내용을 데이터베이스에 저장하여 영구적으로 보관하면 어떨까? 하는 생각을 하였다.
사용된 도구 및 버전은 아래와 같다.
- DBeaver Community 23.3.2
- Maria DB 10.3 client
- mysql
node를 사용했을 때 경험을 바탕으로 우선적으로 데이터베이스와 유저, 그리고 테이블을 생성하였다.
Window는 cmd 창을 이용해도 되지만 필자는 PowerShell에 관리자 권한으로 디비에 접속하는 것을 선호한다.
기본적인 데이터베이스 명명 및 유저 생성, 테이블 생성에 관한 내용은 작성하지 않겠다.
데이터 베이스와 테이블이 잘 생성된 것을 볼 수 있다.
생성된 데이터베이스를 자바와 연동시켜야 하는데 이때 우리는 jdbc 라는 놈을 사용한다.
JDBC란? (Java Database Connectivity)
- 데이터를 데이터베이스에 저장 및 업데이트 하거나 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API
- Java 애플리케이션에서 데이터베이스에 접근하기 위해 JDBC API를 사용하여 데이터베이스에 연동가능
- 데이터베이스에서 자료를 쿼리(Query)하거나 업데이트하는 방법을 제공
JDBC는 3가지 기능을 표준 인터페이스로 정의하여 제공
- java.sql.Connection - 연결
- java.sql.Statement - sql을 담은 내용
- java.sql.ResultSet - sql 요청 응답
JDBC 동작 흐름
JDBC API 사용하기 위해서는 JDBC 드라이버를 로딩한 후 데이터베이스와 연결된다. 더 깊게 들어갈 수 있지만 여기 까지만 알고 있어도 데이터베이스에 접근하여 데이터를 저장하는 것은 충분하기에 더한 설명은 하지 않겠다. 나중에 서버에 관련된 내용을 학습하게 된다면 다시 와서 복습할 예정이고 복습을 하면서 더 깊게 들어갈 것이다.
다시 돌아와서,
자바와 데이터베이스를 연결하기 위해 jdbc와 데이터베이스의 기본 정보들을 우선 변수로 선언하였다.
private static final String jdbc ="jdbc:mariadb://localhost:3306/test_minwook"; // jdbc 드라이버 : db와 통신하는 자바 API
private static final String username = "minwook";
private static final String pw = "@alsdnr6457";
위 코드에서 중요하게 볼 내용은 jdbc ="jdbc:mariadb://localhost:3306/test_minwook"; 이다.
현재 Maven을 통해서 프로젝트를 관리하고 있기 때문에 Maven Repository에서 jdbc 드라이버를 연결해주어야 한다.
이는 의존성에 대한 코드는 Maven Repository에서 확인이 가능하며 필자는 아래 버전을 사용하였다.
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.2</version>
</dependency>
jdbc 드라이버와 연결하였다면 데이터베이스와의 연결을 해야한다.
public static Connection getConnection() throws SQLException{ // 데이터베이스와의 연결을 수립
System.out.println("===== 데이터베이스 연결 =====");
return DriverManager.getConnection(jdbc,username,pw); // Connection 객체 반환
}
위에서 사용한 메소드는 DriverManager 클래스에 정의된 getConnection 메서드 이다.
해당 메소드는 Java Doc에서 sql 내용을 찾아보다가 발견하였다. Java Doc에 다음과 같이 정의되어 있다.
Connection 객체를 반환하는 메서드로 Connection 객체는 직접적으로 url을 가지고 있지 않지만 데이터베이스 연결 정보는 DriverManager.getConnection() 메서드에 전달되는 JDBC URL에 포함된다.
데이터베이스를 연결하였다면 이제 쿼리문을 실행하여 데이터를 저장해보자.
public void insertArticle(info article) {
String sql = "INSERT INTO t_article_m (title, contents, publisher, upload, imgUrl) VALUES (?, ?, ?, ?, ?)";
try (Connection connection = getConnection(); // sql 연결
/* PreparedStatement : 동적으로 값을 바인딩하여 sql 인젝션 공격 방지*/
PreparedStatement statement = connection.prepareStatement(sql)) {
System.out.println("===== sql 동작 시작 =====");
statement.setString(1, article.getTitle()); // 1번 인덱스로 제목 저장
statement.setString(2, article.getContent()); // 2번 인덱스로 내용 저장
statement.setString(3, article.getPublisher()); // 3번 인덱스로 출처 저장
statement.setString(4, article.getUpload()); // 4번 인덱스로 업로드 시기 저장
statement.setString(5, article.getUrl()); // 5번 인덱스로 url 저장
statement.executeUpdate(); // insert , update, delete 등 쿼리 실행
} catch (SQLException e) {
e.printStackTrace();
}
}
해당 코드는 데이터베이스에 sql 쿼리를 실행하는 코드이다. 주석을 작성하긴 했지만 추가적인 내용을 덧붙이자면,
여기서도 try-with-resource 문법을 사용하였다. 해당 문법은 위에서 언급하였기에 따로 더 설명하지 않겠다.
또한, 중요시하게 볼 내용은 PreparedStatement statement = connection.prepareStatement(sql) 이다.
- Connection 객체를 통해 생성하며, 주로 동적인 데이터를 쿼리에 바인딩할 때 사용한다.
- PreparedStatement를 사용하면 sql 쿼리를 미리 컴파일 하고 쿼리 최적화를 수행할 수 있다.
- 외부에서 받은 데이터를 안전하게 쿼리에 바인딩할 수 있어 SQL 인젝션과 같은 보안 문제를 방지할 수 있다.
마지막으로 setString()을 통해 sql 문에 선언한 (?)에 인덱스에 맞게 각각 바인딩하고 executeUpdate() 메소드를 호출하여 쿼리를 실행한다.
테이블 정의
테이블은 DBeaver 도구를 이용하여 비교적 쉽게 정의하였다.
코드 실행 후 결과
데이터 베이스
각 내용별로 잘 저장된 것을 볼 수 있다.
PowerShell에서 연결하여 확인한 결과도 잘 나오는 것을 볼 수 있다.
데이터베이스에 내용을 저장했으므로 이제 웹 화면에 해당 정보를 출력하는 과정까지 도전해볼 예정이다.
[전체코드]
https://github.com/MinWook6457/WebCrolling
'인실리코젠' 카테고리의 다른 글
[인실리코젠] Spring : 용어 정리(기본) (0) | 2024.01.19 |
---|---|
[인실리코젠] Spring Boot + MVC 이론 정리 (0) | 2024.01.17 |
[인실리코젠] Maven에 대하여 (0) | 2024.01.12 |
[인실리코젠] Apache POI 라이브러리를 이용한 Exel 데이터 읽기 2 (0) | 2024.01.12 |
[인실리코젠] Programmers Lv2.JadenCase 문자열 만들기 리뷰 답변 및 BPM(Business Process Management) 프로세스 모델링 (1) | 2024.01.11 |