먼저 아래 사이트에 가입한다

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

가입이 모두 끝났으면 콘솔창으로 들어간다.

 

콘솔창으로 들어오면 NAVER API 가 보인다. 들어가자

 

어플리케이션 등록 클릭

 

어플리케이션 이름설정

 

Web Dynamic Map은 지도 HTML을 제공하고

Static Map 은 지도 이미지를 제공할 수 있다 

원하는 것으로 선택

 

 

Web서비스 url등을 지정해줘야한다. html파일이 아닌 서버자체를 지정해줘야함

 

모두 입력했다면 등록

 

내 Application창에 이렇게 나오고 인증 정보를 확인하면 키값을 볼 수 있다

 

아래 빨간 네모 안의 버튼을 누르면 사용가이드가 나온다

 

 

 

'낙서장' 카테고리의 다른 글

괜찮은 출판사, 책  (0) 2020.05.11
프로젝트 제작시 폴더 구분  (0) 2020.04.28
200424  (0) 2020.04.24
200423  (0) 2020.04.23
200417 // API, SDK, synchronized, Object클래스, 임계구역  (0) 2020.04.17

준비물 : 자바, 오라클DB, SQL Developer

 

들어가기 전에...

처음 오신 분들은 아래의 내용을 숙지하고 진행하시는 것이 좋습니다.

https://ondolroom.tistory.com/265

 

자바 프로그램을 함수화(모듈화) 하기

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요. 프로그램과 모듈 1. 프로그램 main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다. 2. 모듈 아래와 같이 main이..

ondolroom.tistory.com

https://ondolroom.tistory.com/266

 

공공데이터를 사용하기 요약

들어가기 전에... 먼저 프로그램은 모두 간단한 원리부터 파악하고 제작 해야한다. hello, world!를 출력하는 프로그램이나 공공데이터를 받아와서 출력 하는 프로그램이나 원리는 같다. 코드 길이가 조금 더 길어..

ondolroom.tistory.com

https://ondolroom.tistory.com/267

 

자바 공공데이터 + SWING 연동하기

들어가기 전에... 처음 들어오신 분은 아래 페이지를 먼저 읽어보도록 합시다 https://ondolroom.tistory.com/265 자바 프로그램을 함수화(모듈화) 하기 *해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아..

ondolroom.tistory.com

 

DB 유저 생성

SQL Developer에서 관리자에 접속한 뒤

아이디 test1 비번 test1 을 쳐본다.

 

위 오류는  오라클 11 버전 이상부터 발생하는 것으로

2가지 해결법이 있다

 

1. 아이디에 c##을 붙이기

말그대로 test1을 c##test1로 적어서 실행하는 것이다.

이 방법이 헷갈린다면 아래 2번을 따라해보자

 

2. ALTER SESSION SET "_ORACLE_SCRIPT" = true;  사용하기

아이디 비밀번호를 생성하기 전에 아래처럼 코드를 미리 하나 더 실행 해줘야한다

코드를 복사하려면 더보기 클릭

더보기

ALTER SESSION SET "_ORACLE_SCRIPT" = true;

CREATE USER test1 IDENTIFIED BY test1;

 

다시 아이디 비밀번호를 입력하면 정상적으로 실행된다

 

 

유저에게 권한주기

생성한 유저에게 권한을 줘야만 테이블 등을 생성하고 내용을 입력 할 수 있다

코드를 복사하려면 더보기 클릭

더보기

GRANT CREATE SESSION TO test1;
GRANT CREATE TABLESPACE TO test1;
GRANT CREATE TABLE TO test1;
alter user test1 
default tablespace users quota unlimited on users;

 

 

 

유저 스키마 생성

접속 파트의 +버튼을 눌러서 새 스키마를 생성해보자

 

스키마의 이름을 적고

아이디 비밀번호를 입력한다

세부정보는 그대로 유지하고 테스트를 해본다

위 사진에서 왼쪽아래에 보면 성공이라고 뜨면 잘 작동하는 것이다

접속을 누른다

 

접속 파트에 테스트라는 스키마가 생기고

워크시트도 테스트유저로 바뀌었다

 

테이블 생성

테이블을 마우스 오른쪽 클릭하면 새 테이블 생성메뉴가 있다

들어가 보자

 

아래와 같이 나온다

테이블 이름은 영어로 하는 것이 좋다

+ 버튼을 이용해서 속성을 추가해보자

 

약국이름 (NAME)과 주소(LOC)를 만들었다

약국이름은 문자열이기 때문에 VARCHAR2를 사용하였고, 1글자에 3바이트를 가정하고 넉넉하게 40을 주었다

주소 또한 문자열이기 때문에 VARCHAR2를 사용하였고, 넉넉하게 300을 주었다

오른쪽 아래의 확인을 눌러 테이블을 생성한다

 

 

접속 파트에 생성 된 테이블을 확인하자

 

 

테이블에 데이터 넣기

워크시트에서 테스트 자료를 넣는 코드를 짜보자

아래와 같이 입력해본다

더보기

INSERT INTO drugstore(NAME, LOC)
VALUES('테스트약국', '서울특별시 강남구 XX');

 

정상적으로 삽입된 것을 확인

 

테이블을 불러와보면 잘 나오는 것을 확인 할 수 있다

 

마지막으로 커밋을 해주면 DB에 저장된다

 

 

오라클 라이브러리를 자바에 연결하기

먼저 컴퓨터에 설치된 오라클이나 디벨로퍼에서 ojdbc8.jar을 찾아본다

 

해당 파일을 복사해서 이클립스의 개인 라이브러리 폴더에 넣는다

 

해당 워크스페이스를 오른쪽 클릭하여 빌드패스에 접속한다

 

라이브러리 탭에서 Add JARs를 선택하고 ojdbc8.jar을 추가한다

 

추가되었다면 Apply and Close를 누른다

 

java 코드 작성

TestDB.java라는 파일을 생성하고 어떤 메서드를 넣을 것인지 정한다

아래의 5가지 기능을 구현할 것 이다.

DB에 연결하기
DB 연결 끊기
데이터 넣기(INSERT)
데이터 가져오기(SELECT)
데이터 지우기(DELETE)

과도한 try catch 남발을 방지하고 알아보기 쉬운 코드를 위해
throws Exception을 함수 뒤에 붙여주었다

 

그리고 약국 정보를 저장할 객체도 만들어 준다

 

코드를 복사하려면 더보기를 클릭

더보기
package example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

class Info {
	String name;
	String loc;
	
	public Info(String name, String loc) {
		this.name = name;
		this.loc = loc;
	}
}

public class TestDB {

	// 전역 공간에 쿼리에 필요한 레퍼런스를 준비하기
	

	// DB에 연결하기
	void openCon() throws Exception {

	}

	// DB 연결 끊기
	void closeCon() throws Exception {

	}

	// 데이터 넣기
	void insertData(String name, String loc) throws Exception {

	}

	// 데이터 가져오기
	void selectData() throws Exception { 
		
	}
	
	// 데이터 지우기
	void deleteData(String name) throws Exception {
		
	}

	public static void main(String[] args) {

	}
}

 

전역 공간에 레퍼런스 준비

함수들이 객체나 데이터를 공유하기 위해서는 레퍼런스가 전역 공간에 준비되어야 한다

코드를 복사하려면 더보기 클릭

더보기
	Connection con; // 디비 연결
	String query; // 쿼리문 내용
	Statement stmt; // 워크시트 (쿼리문 입력 공간)
	ResultSet rs; // 결과
	ArrayList<Info> storeInfos = new ArrayList<>(); // 결과를 어레이리스트에 저장

 

DB 연결 메서드

해당 내용은 외울 필요없이 어디에 저장해 놓았다가 꺼내서 쓰자

흐름만 알면된다.

1.자바 라이브러리 파일로딩
2.입출력 객체 생성
3.워크시트 생성

코드를 복사하려면 더보기 클릭

더보기
		// 오라클 주소, 아이디 비밀번호
		String url = "jdbc:oracle:thin:@localhost:1521:XE";
		String userid = "test1";
		String pwd = "test1";

		// 자바 라이브러리 파일 로드
		Class.forName("oracle.jdbc.driver.OracleDriver");
		System.out.println("드라이버 로드 성공");

		// 네트워크 입출력 객체 생성
		System.out.println("데이터베이스 연결 준비...");
		con = DriverManager.getConnection(url, userid, pwd);
		System.out.println("데이터베이스 연결 성공");
		
		// 워크시트 생성
		stmt = con.createStatement();
		System.out.println("워크시트 생성");

 

테스트

main에서 TestDB객체를 생성하고 openCon() 함수를 실행해보자

 

DB 연결 끊기 메서드

간단하게 .close()를 사용하여 만들 수 있다

더보기
		con.close();
		System.out.println("데이터베이스 연결 해제");

 

테스트

연결했다가 끊어본다

 

DB에 데이터 넣기 메서드

stmt라는 워크시트 객체에 INSERT 쿼리문을 입력하고 실행시키는 작업이다

더보기
		query = "INSERT INTO drugstore(name, loc) VALUES('" + name + "', '" + loc + "')";
		
		stmt.executeUpdate(query); // 워크시트에 쿼리문 입력하기
		
		System.out.println(query);

 

테스트

연결 - 인서트 - 연결해제

 

sql로 가서 확인해본다

 

DB에서 데이터 가져오기 메서드

stmt라는 워크시트 객체에 SELECT 쿼리문을 입력하고 실행시키는 작업이다

더보기
		query = "SELECT name, loc FROM drugstore";
		
		System.out.println(query);
		
		rs = stmt.executeQuery(query); // 워크시트에 쿼리문 입력하고 데이터 받기
		while (rs.next()) {
			
			Info temp = new Info(rs.getString(1), rs.getString(2)); // 약국이름과  위치를 가진 객체 생성
			storeInfos.add(temp); //어레이리스트에 객체 추가
		}
		
		for (int i = 0; i < storeInfos.size(); i++) { // 약국 이름과 주소를 튜플 수만큼 출력
			System.out.println(storeInfos.get(i).name + " : " + storeInfos.get(i).loc);
		}

 

테스트

연결 - 셀렉트 - 연결해제

 

DB 데이터 지우기 메서드

인서트와 마찬가지로 stmt객체에 DELETE문을 넣어서 실행시킨다

더보기
		query = "DELETE drugstore WHERE name like '" + name + "'";
		
		stmt.executeUpdate(query);
		
		System.out.println(query);

 

테스트

연결 - 딜리트 - 연결해제

 

sql에서도 확인해보자

 

이렇게 필요한 기능을 간단히 구현해보았다

좀 더 복잡한 기능구현은 추후에 따로 만들어 보기로 한다

 

들어가기 전에...

처음 들어오신 분은 아래 페이지를 먼저 읽어보도록 합시다

https://ondolroom.tistory.com/265

 

자바 프로그램을 함수화(모듈화) 하기

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요. 프로그램과 모듈 1. 프로그램 main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다. 2. 모듈 아래와 같이 main이..

ondolroom.tistory.com

https://ondolroom.tistory.com/266

 

공공데이터를 사용하기 요약

들어가기 전에... 먼저 프로그램은 모두 간단한 원리부터 파악하고 제작 해야한다. hello, world!를 출력하는 프로그램이나 공공데이터를 받아와서 출력 하는 프로그램이나 원리는 같다. 코드 길이가 조금 더 길어..

ondolroom.tistory.com

 

공공데이터 모듈 만들기

공공데이터 사용하기 내용에서 모듈을 살짝 바꾸었다

String을 리턴하는게 아닌

객체 그 자체를 리턴하도록 변경(안의 모든 데이터를 이용할 수 있기위함)

 

WindowBuilder로 GUI만들기

WindowBuilder를 이용하여

검색할 위치 + Jtextfield

검색버튼

출력될 내용을 보여줄  JtextArea를 제작

 

 

전역에서 필요한 기능을 미리 선언해두기

위 GUI에서 우리는

검색버튼을 누르면

JtextField의 내용을 가져와서 가공하여

JtextArea에 넣어줘야한다

 

JtextField의 내용을 가져오고
JtextArea에 내용을 넣기 위해서는 전역공간에 있어야한다는 점을 참고하자

 

 

JButton에 리스너 추가하기

기본 상태의 initialize() 모습.

우리는 여기서 JButton에 리스너를 추가해야한다

 

 

테스트

이제 실행시키면 잘 작동한다

들어가기 전에...

먼저 프로그램은 모두 간단한 원리부터 파악하고 제작 해야한다.

hello, world!를 출력하는 프로그램이나 공공데이터를 받아와서 출력 하는 프로그램이나 원리는 같다.

코드 길이가 조금 더 길어졌을 뿐이다.

공공데이터를 이용하든, String을 이용하든 결국엔 모듈화 하여 기능을 실행하게 된다.

https://ondolroom.tistory.com/265

 

자바 프로그램을 함수화(모듈화) 하기

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요. 프로그램과 모듈 1. 프로그램 main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다. 2. 모듈 아래와 같이 main이..

ondolroom.tistory.com

위의 링크 내용을 숙지하고 아래 이미지를 보자

 

 

 

공공데이터 처리

1.순서

공공데이터 링크확인
http://www.jsonschema2pojo.org/ 으로 Class파일 쉽게 만들기
Gson으로 Json -> 자바객체 전환하기
이용하기

Gson 이 설치 되지 않으신 분들은 미리 설치하시고 시작해주세요

 

2. 적용 과정

1) 예시로 링크 주소는 공적 마스크 판매 약국 데이터로 한다

https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1

 

2) 해당 링크로 인터넷에서 접속해보면 아래와 같이 나온다

 

3) 해당 데이터를 이용해서 데이터를 담을 Class 를 만들어보자

아래 데이터를 긁어서 http://www.jsonschema2pojo.org/ 사이트에 넣어보자

{
  "count": 487,
  "page": "1",
  "storeInfos": [{
    "addr": "충청남도 홍성군 갈산면 상촌로 12-1",
    "code": "34840559",
    "lat": 36.6029863,
    "lng": 126.5489114,
    "name": "신신약국",
    "type": "01"
  }, {
    "addr": "대구광역시 달서구 달구벌대로 1736 1층 (두류동)",
    "code": "37844571",
    "lat": 35.856678,
    "lng": 128.5552778,
    "name": "밝은온누리약국",
    "type": "01"
  }],
  "totalCount": 26776,
  "totalPages": 54
}

 

 

Preview를 누르면 각각의 파일이름과 내용이 생성 된다

이클립스에 파일을 만들어서 각각 붙여넣기를 하자

 

4 ) 공공데이터 출력하기

 

위 코드에 아래 코드를 넣고 조금만 수정하면된다!

아래코드는 외울 필요 없이 어디 저장해놓고 두고두고 사용하자

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("json링크 주소 입력");

			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			// 3번 버퍼 연결 (문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));

			// 4. 문자 더하기
			StringBuilder sb = new StringBuilder();

			// 스트링빌더에 버퍼에서 받은 문자열을 한줄씩 추가하기
			String input = "";
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			
			// 입력이 잘 되었는지 테스트
			System.out.println(sb.toString());
			System.out.println();

			br.close(); // 버퍼 닫기
			con.disconnect(); // 스트림 닫기

			// 5. 자바 오브젝트로 변환
			Gson gson = new Gson();
			Air air = gson.fromJson(sb.toString(), Air.class);

		} catch (Exception e) {
			e.printStackTrace();
		}

 

우리가 바꿀 것은 몇가지 없다.

url 주소넣기
자바 오브젝트 이름을 내가 정한 이름으로 바꾸기
리턴해주기

 

3. main에서 출력하기!

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요.

프로그램과 모듈

1. 프로그램

main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다.

 

2. 모듈

아래와 같이 main이 아닌 함수만 있어서 독립적으로 실행하지 못하는 코드를 모듈이라고 한다.

 

모듈을 이용하는 방법

1. 같은 파일 내에 있는 모듈

main에서 해당 기능이 있는 클래스.메서드() 를 이용하여 호출한다.

(이 파일에는 모듈도 있고 실행 시킬 수 있는 main이 있으니, 결과적으로 프로그램이다. )

 

2. 패키지는 같지만 다른 파일 내에 있는 모듈

아래 그림처럼 패키지는 같지만 다른 파일로 나뉘어 있을 경우

같은 파일에 있는 모듈을 사용하는 것 처럼 쉽게 이용가능하다.

Say.java
Function1.java

 

3. 패키지가 다른 모듈

아래 그림처럼 패키지가 다른 경우

모듈이 될 클래스나 기능들은 public으로 작성해야 불러올 수 있다. 

exModule.Say.java

 

main이 있는 파일에서는 모듈을 import 해와야 한다.

example.Function1.java

 

*exModule에 있는 코드에서 public을 제거 해보고 테스트도 해보자.

 

ps. 생성자를 함수처럼 사용 가능하다

아래 그림과 같이 Say의 생성자에 기능을 넣고 

main에서 해당 클래스를 인스턴스화 하면 생성자가 실행 된다.

스윙 컴포넌트

package ch11;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JComponentEx extends JFrame {
	
	private JButton b1, b2, b3;
	
	
	public JComponentEx(){
		setTitle("JComponent의 공통 메소드 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		b1 = new JButton("Magenta/Yellow Button");
		b2 = new JButton("___Disabled Button___");
		b3 = new JButton("getX(), getY()");
		
		b1.setBackground(Color.YELLOW); // 백그라운드
		b1.setForeground(Color.MAGENTA); // 포그라운드
		b1.setFont(new Font("Arial", Font.ITALIC, 20));
		b2.setEnabled(false);
		b3.addActionListener(new ActionListener() {
			
			//타겟 (콜백되는)
			@Override
			public void actionPerformed(ActionEvent e) {
				//JButton b = (JButton)e.getSource(); // Object를 리턴하기 때문에 다운캐스팅!!
				b3.setText("hello");
				//JComponentEx frame = (JComponentEx)b.getTopLevelAncestor();
				//frame.setTitle(b.getX() + "," + b.getY());
			}
		});
		
		c.add(b1); c.add(b2); c.add(b3);
		
		setSize(260, 200);
		setVisible(true);
		
		
		
	}
	
	public static void main(String[] args) {
		new JComponentEx();
	}
}

 

여러 버튼에 같은 리스너 적용

package ch11;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JComponentEx01 extends JFrame implements ActionListener{

	private JButton b1, b2, b3;
	
	// 타겟
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton) e.getSource();
		b.setText("Hello");
	}
	
	public JComponentEx01() {
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		b1 = new JButton("b1");
		b2 = new JButton("b2");
		b3 = new JButton("b3");
		
		b1.addActionListener(this);
		b2.addActionListener(this);
		b3.addActionListener(this);
		
		c.add(b1);
		c.add(b2);
		c.add(b3);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(260, 200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new JComponentEx01();
	}

}

.

다양한 시간 포맷팅 방법

package dateex;

import java.util.Calendar;

public class CalenderEx {
	// 2020-03-18
	public static void printCalender(String msg, Calendar cal) {
		int year = cal.get(Calendar.YEAR); // 2020 
		
		int month = cal.get(Calendar.MONTH) + 1; // 1월은 0으로 나온다. 그래서 +1해줘야함
		String mon = (month < 10)?"0" + month:"" + month;
		
		int day = cal.get(Calendar.DAY_OF_MONTH);
		String day1 = (day < 10)?"0" + day:"" + day;
		
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		String hour1 = (hour < 10)?"0" + hour:"" + hour;
		
		int minute = cal.get(Calendar.MINUTE);
		String minute1 = (minute < 10)?"0" + minute:"" + minute;
		
		int second = cal.get(Calendar.SECOND);
		String second1 = (second < 10)?"0" + second:"" + second;
		
		System.out.println(msg + " " + year+"-"+mon+"-"+day+":"+hour1+":"+minute1+":"+second1);
		
	}
	
	public static void main(String[] args) {
		Calendar a = Calendar.getInstance(); // 싱글톤
		
		printCalender("현재", a);
	}
}

 

Calender

 

java.util.Date

getDay()의 빨간줄은 더 이상 사용하지 말라는 뜻(유예를 주는 것)

 

java.sql.Date

 

 

java.sql.Timestamp

 

LocalDate

 

자바에서 시간을 만들어서 DB에 넣는 것이 IO가 줄어들어서 빠르게 작동한다

HashSet // TreeSet

package dateex;

import java.util.HashSet;
import java.util.Random;

public class Lotto {
	public static void main(String[] args) {
		
		
		// HashSet 순서가 없음 (엄청빠름)
		// TreeSet 순서대로 정렬 (HashSet보다 느림)
		HashSet<Integer> lotto = new HashSet<>();
		Random r = new Random();
		
		while (lotto.size() < 6) {
			int value = r.nextInt(45) + 1;
			lotto.add(value);
		}

		System.out.println(lotto);
		
	}
}

.

+ Recent posts