ㅁ4번째 프로젝트 복붙으로 가져와서 05_MVC_JDBC_Porperties,Dynamic으로 변경.
- 정적 코딩방식을 동적 코딩 방식으로 바꾸는 걸 해본다.
ㅁ run 패키지에 PropertiesTest 클래스 만들고 프로퍼티스 복습.
ㅁ < Properties >
- Map 계열의 컬렉션이라 key:value 세트로 저장된다.
- 순서 유지 x, 중복 저장 x(가장 최근에 저장한 것으로 저장됨)
- key도 value도 String 타입이다.
- setProperty(key, value) : 데이터 담기
- getPropery(key) : value 꺼내기
ㅁ 프로젝트 우클릭 - new - folder로 폴더 만들기
- 보통 외부 자원들을 보관하는 폴더로 resources라는 이름을 씀.
ㅁ list, set, map 참조타입 변수를 바로 출력했을 때
- List의 toString: 요소를 대괄호 [와 ]로 감싸고 쉼표로 구분하여 문자열로 변환합니다.
- Set의 toString: 요소를 대괄호 [와 ]로 감싸고 쉼표로 구분하여 문자열로 변환하며, 요소의 순서는 보장되지 않을 수 있습니다.
- Map의 toString: 각 키-값 쌍을 중괄호 {와 }로 감싸고 =로 구분하여 문자열로 변환합니다.
[Apple, Banana, Cherry]
[Apple, Banana, Cherry]
{Apple=1, Banana=2, Cherry=3}
ㅁ 자바에서 프로퍼티 파일에 기록하기
package com.br.run;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesTest {
public static void main(String[] args) {
Properties prop = new Properties();
prop.setProperty("academy", "goodee academy");
prop.setProperty("classRoom", "A");
System.out.println(prop);
try {
prop.store(new FileOutputStream("resources/test.properties"), "test.properties");
prop.storeToXML(new FileOutputStream("resources/test.xml") , "test.xml");
}
catch (IOException e) { e.printStackTrace(); }
}
}
[실행 결과]
{academy=goodee academy, classRoom=A}
ㅁ
- system 뒤 url은 프로퍼티스와 관련된 태그로 작성되었는지 유효성 검사를 해준다.
- properties는 밸류값을 한 줄로 써야 함. 여러 줄로 밸류값을 쓰고 싶다면 xml을 이용.
xml은 시작태그와 종료태그 사이에만 쓰이면 됨. 그래서 여러 줄로 표기 가능.
단 콘솔에 엔터치면 그대로 출력됨.
- xml 파일에 빨간줄이 떠도 실행에는 문제 없는데 거슬림.
window 메뉴 - preferences - XML(wild web Developer)에서 첫번째 Download 어쩌구를 체크하면 빨간줄 사라짐.
===============================================================
ㅁ사실 우리가 자바에서 프로퍼티스 파일에 기록할 일은 없음. 가져와서 쓴다.
- 파일에서 읽어들일 때는 load 메소드 사용.
ㅁ XML 파일
- xml 파일에서 자바로 데이터를 불러올 때는 loadFromXml() 메소드.
- xml은 시작태그부터 종료태그까지를 밸류로 취급함.
만약 줄바꿈을하면 그것까지도 다 데이터로 취급함.
ㅁ 프로퍼티스 복습 끝
==================================================================
ㅁ JDBCTemplate의 getConnection 메소드
ㅁ
- 기존의 방식 : driver 구문과 접속할 db 정보가 자바소스코드 내에 명시적으로 작성 (정적 코딩 방식)
- 문제점 : dbms가 변경되거나, 접속할 db의 정보가 변경될 경우.
자바소스코드를 수정해야 하는데 그럴려면 프로그램 재구동시켜야 함.(비정상적으로 종료됐다가 다시 구동)
사용자 입장에서는 잘 쓰던 프로그램이 갑자기 멈춘다.
(회사에서 오라클에서 마리아db로)
(은행 12시에 멈춘다.)
- 프로그램 관리자(일반인)가 자바코드를 볼 줄 몰라서 수정하기가 어려움.
- 해결방식 : db관련 정보들을 외부 파일로 따로 저장시키고 파일 정보를 읽어들여서 프로그램에 반영시킨다.
정적으로 자바 코드상에 박혀있지 않고 (하드코딩) 동적으로 외부 파일에 기술되어 있고 그 파일 내용을 불러온다.
(동적코딩 방식)
<= 정보를 변경할 경우 파일만 수정하면 된다. 프로그램 재구동시킬 필요 없다.
ㅁ
- driver과 url은 한줄짜리 구문이라 프로퍼티 파일에 기록한다.
- test.properties 파일을 패키지 익스플로러에서 f2 누르거나 우클릭-refactor-rename해서 driver.properties로 바꾼다.
- driver.properties 파일을 연다.
주석 다 지운다.
다른 내용도 다 지운다. (완전 공백)
- 키 밸류 작성한다.
- 따옴표 안 써도 된다. 마침표 온점도.
- 환경설정 관련된 구문들을 외부 파일에 작성하고 있다.
- 저 구문들을 자바 코드상에 정적으로 써 두지 않고 외부 파일에 따로 작성했다.
- db 관련 정보를 외부 파일로 뺐다.
ㅁ Properties 파일의 내용을 불러와서 Properties라는 객체에 담는다.
- 이러면 이제 db에 대한 정보를 수정해야 한다면 자바 프로그램 열 필요없이 저 프로퍼티 파일만 수정하면 된다.
- 프로퍼티스 파일에서 아이디와 비번을 BR, BR로 바꾸고 실행하면
BR계정에는 MEMBER테이블이 없기 때문에
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
rset = pstmt.executeQuery();에서 에러가 난다.
- 프로그램 재구동없이 파일 변경만으로 바로 반영이 된다.
ㅁ 이렇게 동적코딩 방식으로 바꿀 곳이 한곳 더 있음.
- com.br.model.dao.MemberDao
- 여기에 자바 소스코드 상에 정적으로 작성되어있는 sql문을 외부 파일로 뺀다.
- 나중에 혹시라도 쿼리가 변경될 수 있음. 개발 끝나고 배포해서 사용자들이 이용하고 있는데 sql문을 바꾸고 싶은 경우 있을 수 있음. 그러려면 수정 후 반영하려면 프로그램을 재구동할 수 밖에 없다.
파일로 빼놓으면 파일만 변경하면 되고.
- 기존의 방식 : 사용자가 요청할 때마다 실행되는 sql문들이 자바소스코드 내에 명시적으로 작성 (정적코딩방식)
- 문제점 : sql문을 수정해야할 경우 자바코드를 수정해야 함. 반영시키고자 할 경우 프로그램 재구동 필요.
- 해결방식 : sql문들만 별도로 관리하는 외부파일을 만들어서 "실시간"으로 그 파일에 기록된 sql문을 읽어들여서 실행하도록 (동적코딩방식)
- sql문은 길다. 여러 줄로 작성하는게 가독성에도 좋고. 그래서 프로퍼티 파일이 아닌 xml파일로 작성한다.
- 7개의 sql문들을 외부 파일에 기록한다.
test.xml 파일의 이름을 query.xml로 수정한다.
- query.xml 파일을 열고 <properties> ~ </properties> 안의 내용을 다 지운다.
- 다 지운다.
- 메소드명을 키값으로 보통 사용.
- 프로퍼티 파일은 키, 값 다 따옴표 없음. xml 파일은 키는 따옴표 있음.
- SELECT * 하면 느려짐.
모든 컬럼을 조회한다고 해도 일일이 다 컬럼명 써두기.
다른 사람이 보기에도 다 나열하는게 알아보기 좋다.
ㅁ 위의 방식으로 XML파일에 총 7개의 entry를 만들어서 키, 밸류를 만든다.
- 가독성을 위해 INSERT INTO MEMBER 다음에 컬럼명을 다 써준다.
이러면 어떤 컬럼에 어떤 값을 넣는지 매칭해서 볼 수 있다.
- 그런데 기존에는 REGIST_DATE에 SYSDATE를 넣었는데,
지금은 9개의 컬럼에 9개의 값만 넣는다. 어차피 DEFAULT SYSDATE라서.
- <!-- XML 파일에서의 주석 -->
ㅁ 다른 5개의 sql문도 xml파일에 작성.
- 절대 세미콜론 들어가면 안 됨. 자바에 썼던 sql문 그대로 쓴다.
- xml의 키에만 따옴표 들어가고, value에는 따옴표 안 들어간다!
- 선생님은 String 변수에 USER_NAME 하나만 담았다.
ㅁ xml 파일 작성이 끝났으면 자바로 돌아와서 String sql 이 하드코딩된 문자열이 아닌 xml파일에서 가져온 문자열을 가지게끔 한다.
- Properties 객체를 여러 메소드에서 사용하기 때문에 메소드 안이 아닌 클래스에 선언해서 전역변수로 사용한다.
- loadFromXml() 메소드가 모든 메소드들에서 String sql 전에 사용되어야 한다.
멤버서비스를 가 보면 멤버다오를 만들고나서 그 객체의 메소드를 사용한다.
보면 일단 기본생성자로 생성함을 알 수 있다.
그러니 멤버다오으 ㅣ기본 생성자에다가 만들어준다.
- dao측 메소드가 호출될 때 마다 new MemberDao().xxxxx(); 호출
즉, 기본생성자 실행 후 메소드 실행한다.
- 7개 다 이런식으로 바꾸고 전부 문제없이 작동되는지 확인.
ㅁ 이전 프로젝트는 볼 필요 없다. 5번째 프로젝트만 주구장창 복습하면 된다. 단계별로 거쳐온거라.
ㅁ 5번 프로젝트에 메뉴 몇 개 추가
(1) 8번 메뉴
- 나이가 가장 많은 회원의 이름 조회
- 사용자에게서 입력받을 데이터 없음 (바로 컨트롤러 요청)
- 조회결과가 없을 경우 displayNoData("조회된 회원이 없습니다")
- 조회결과가 있을 경우 displaySuccess("xxx님 입니다.")
- 서브쿼리
(2) 9번 메뉴
- 전체 회원수 조회
- 사용자에게서 입력받을 데이터 없음 (바로 컨트롤러 요청)
- 조회결과가 있는지 없는지 판별할 필요 없이
displaySuccess("전체 회원수는 x명 입니다.")
ㅁ JDBC 수업 끝.
'클라우드 활용 자바개발자 양성과정 > 02-2. JDBC' 카테고리의 다른 글
7. JDBC MVC패턴 실습문제 & 최종정리 (0) | 2024.08.01 |
---|---|
4. 모듈화 작업 & static import (0) | 2024.07.31 |
3. PreparedStatement (0) | 2024.07.30 |
2. JDBC에 MVC 패턴 적용하기 (0) | 2024.07.29 |
1. JDBC 기본 (0) | 2024.07.29 |