본문 바로가기
클라우드 활용 자바개발자 양성과정/02-2. JDBC

5. Properties

by moca7 2024. 8. 1.

 

ㅁ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 수업 끝.