**Spring의 IOC 이용 



1. IOC(Inversion of Control)란 무엇인가? 

객체 생성을 직접하지 않고 프레임워크나 컨테이너가 생성해 준 객체를 이용하는 것을 IOC(제어의 역전)이라고 합니다. 



2. IOC방법은 어떠한 방법이 있을까요 ? 

1.  어노테이션(@)을 이용하는 방법    AnnotationConfigApplicationContext, 

2.   XML 파일을 이용하는 2가지 방법이 있습니다. 

GenericXmlApplicationContext 클래스가 ApplicationContext 인터페이스를 implements 




3. 제어의 역전(IOC)에 대해 이해해 봅시다.

일반적인 프로그램에서의 오브젝트에 대한 제어는 오브젝트를 생성하고 그 오브젝트를 이용해서 작업을 수행하는 형태입니다.

예를 들어서 

ClassA 가 있고 이걸 Main에서 호출해서 사용하려면 

ClassA exm = new ClassA(); 형식으로 객체를 생성해야할 것입니다. 


하지만, 제어의 역전이란 앞에서의 코드처럼 직접 객체를 생성하지 않고 다른 곳에서 생성해 준 객체를 가지고 작업을 수행하는 방식입니다.


4. 이러한 예는 서블릿에서도 찾을 수 있다. 

Eclipse 기반의 톰캣 컨테이너를 사용하는 프로젝트에서 서블릿은 직접 생성자를 호출해서 객체를 생성한 적이 없는데 

클라이언트의 요청이 오면 서블릿 객체의 doGet이나 doPost 메소드가 호출되는데 

이는 서블릿 객체에 대한 제어 권한을 컨테이너가 소유하고 있어서 적절한 시점에 서블릿 클래스의 오브젝트를 생성하고 

그 안의 메소드를 호출해주는 형태로 동작하기 때문인데 이러한 방식을 제어의 역전이라고 합니다.


프레임워크나 Connection Pool 이용한 데이터베이스 활용도 제어의 역전을 활용한 예로 객체 생성 시 객체의 생성자를 직접 호출하지 않습니다.



IOC(제어의 역전 활용해봅시다. )


1. 어노테이션 방법 


1
2
3
4
5
6
7
8
9
10
//팩토리 클래스로 만들어주는 어노테이션
@Configuration
public class GoodDaoFactory {
    //GoodDao 클래스의 객체 생성 메소드를 호출해서 리턴
    //객체를 생성해주는 메소드라는 어노테이션
    @Bean
    public static GoodDao create() {
        return new GoodDao();
    }
}
cs



2. 메인 클래스 생성 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main;
 
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
import dao.GoodDao;
import dao.GoodDaoFactory;
 
public class Main {
 
    //Java 응용 프로그램에서 사용되는 entry point(진입점)
    //Java 응용 프로그램을 실행하면 이 메소드가 호출됩니다.
    public static void main(String[] args) {
              
        //스프링의 annotation을 이용해서 객체 생성 
        //팩토리 클래스 지정 
        AnnotationConfigApplicationContext applicationContext = 
                new AnnotationConfigApplicationContext(GoodDaoFactory.class);
        
        //객체 생성 
        GoodDao goodDao = applicationContext.getBean("create",GoodDao.class);
        
        //메소드 호출 
        System.out.println(goodDao.getGood("001"));
        
        
    }
}
cs




**XML 파일을 이용한 Bean 설정 (IOC)  


Spring Bean Configuration 파일을 만들어서 bean 태그를 이용해서 설정하면 어노테이션을 이용했던 것처럼 사용할 수 있습니다. 

이 방법이 더 많이 사용됩니다. 

=> Spring Bean Configuration파일은 beans 태그로 시작해야합니다. 


1. beans 태그 

beans 태그를 만들 때 네임스페이스 또는 xml 스키마 관련 정보를 같이 넣어야 합니다. 

하위 태그로는 <bean>, <import>, <decription>,  <alias> 등이 있습니다. 


1-1) bean 태그 : 객체를 생성하기 위한 태그 

2) import 태그 : 설정해야 할 내용이 많을 때나 여러 곳에서 공통으로 사용하는 설정이 있을 때 다른 파일에 설정 내용을 작성하고 

호출해서 사용하기 위한 태그 

<import resource="다른 설정 파일 경로"/>



2. bean 태그를 이용해서 객체 생성 

1) spring bean configuration 파일에 bean 태그를 추가 

<bean id ="구별 아이디" class="객체를 생성할 클래스 경로 "> </bean>


2-1) 가져다가 사용할 파일에 추가 

GenericeXmlApplicationContext  변수명 = new GenericXmlApplicationContext("스프링 설정파일 경로");

클래스 이름 객체 변수명 = 변수명.getBean("구별할 아이디", 클래스이름.class);




실습해봅시다. 

1. Spring에서   spring legacy project를 생성한 후 


2. src/main/ resource에 오른쪽 클릭 New => Spring Bean Configuration


3. 파일 이름은  : applicationContext.xml 설정 


1
2
3
4
5
6
7
8
9
10
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- GoodDao 클래스의 객체를 goodDao라는 이름으로 생성 -->
    <bean id = "goodDao" class="dao.GoodDao" destroy-method=""></bean>
    
</beans>
cs


1
2
3
4
5
6
7
8
// 메인에서 실행

GenericXmlApplicationContext context =
 new GenericXmlApplicationContext("classpath:applicationContext.xml");
 
객체 생성         
GoodDao goodDao = context.getBean("goodDao", GoodDao.class);    //xml 파일에설정한 class태그에서 .다음클래스이름 가져오면됩니다. 
System.out.println(goodDao.getGood("001"));
context.close();
 
cs








이 글에서 사용한 클래스 내용 


dao. ClassDAO


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import domain.Good;
 
public class GoodDao{
 
    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;
 
    public GoodDao() {
        System.out.println("생성자");
    }
 
    public void init() {
        System.out.println("초기화 메소드");
    }
 
    // 문자열로 된 code를 입력받아서 goods 테이블에서 데이터를
    // 찾아서 리턴하는 메소드
    public Good getGood(String code) {
 
        Good good = null;
        // 문제가 발생할 가능성이 있는 코드
        try {
            // 오라클 드라이버 클래스 로드
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 데이터베이스 연결
            con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.200:1521:xe""user08""user08");
 
            // goods 테이블에서 code를 가지고 테이터를 조회하는 sql
            pstmt = con.prepareStatement("select *from goods where code =? ");
            pstmt.setString(1, code);
 
            // SQL 실행
            rs = pstmt.executeQuery();
            if (rs.next()) {
                good = 
                good.setCode(rs.getString("code"));
                good.setName(rs.getString("name"));
                good.setManufacture(rs.getString("manufacture"));
                good.setPrice(rs.getInt("price"));
            }
            // 문제가 발생했을 때 수행할 코드
        } catch (Exception e) {
            System.out.println("[Dao] get메소드 예외 " + e.getMessage());
            e.printStackTrace();
            // 무조건 수행할 코드
            // 프로그램은 필연적으로 예측할 수없는 예외가 생길 수 있습니다.
            // 프로그램은 예외가 생겨도 팅기면 안되기 때문에 try catch를 씁니ㅏㄷ.
        } finally {
 
            try {
                if (rs != null)
                    rs.close();
                if (pstmt != null)
                    pstmt.close();
                if (con != null)
                    con.close();
            } catch (SQLException e) {
                System.out.println("[DAO]닫기 예외" + e.getMessage());
                e.printStackTrace();
            }
 
        }
        return good;
    }
 
}
cs





domain.Good


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package domain;
 
 
 
public class Good  {
    //데이터를 저장하기 위한 변수 
    //private : 객체가 사용할 수 없음 
    private String code;
    private String name;
    private String manufacture;
    private  int price;
    
    public  Good(String code) {
        this.code = code; 
    }
    //객체가 변수를 사용할 수 있도록 해주는 메소드 
    //일반 변수는 동기화 제어를 할 수 없지만 메소드는 가능합니다. 
    // 동시에 같이 쓸 수 있다. 
    
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManufacture() {
        return manufacture;
    }
    public void setManufacture(String manufacture) {
        this.manufacture = manufacture;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    
    
    
    
    @Override
    public String toString() {
        return "Good [code=" + code + ", name=" + name + ", manufacture=" + manufacture + ", price=" + price + "]";
    }
    
    
}
 
cs




applicationContext.xml 


1
<bean id = "goodDao" class="dao.GoodDao" init-method="init" lazy-init="true"></bean>
cs


'Java > 스프링' 카테고리의 다른 글

Spring 2-2 TEST 디렉토리 사용  (0) 2018.04.09
Spring 2-1 Property(속성)  (0) 2018.04.09
Spring 1- 2 DI와 IOC ,@Component @Bean 사용 정리  (0) 2018.04.06
DI(Dependency Injection)  (0) 2018.04.05
1. Spring의 정의와 특징  (0) 2018.04.05

스프링 





스프링이란 무엇인가 ? 

자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스로 경량급 Application 프레임워크입니다. 



스프링의 특징 

=> 가장 강력한 자바 오픈소스 프레임워크 
=> J2EE가 가진 거의 모든 기능을 소유한 프레임워크 

ü복잡함에 반기를 들어서 나온 프레임워크
ü플랫폼 호환성 문제 해결
ü스프링은 JavaEE가 제공하는 다수의 기능을 지원하고 있기 때문에 JavaEE대체
ü스프링은 IoC(제어의 역전) 지원
+> Ioc(제어의 역전) 객체를 내가 만들지 않는 것 클래스 
=> ex ) FIlter, Controller 
ü스프링은 DI(Dependency Injection)패턴을 지원
=> DI : 의존성 주입  Maven의 Pom.xml 

ü스프링은 AOP(Aspect Oriented Programming)지원
=> AOP :  관점 지향프로그래밍 관점에 따라 나누어 작업하자 
ü스프링은 POJO(Plain Old Java Object)지원

=> POJO는 MVC 패턴을 적용한 프로젝트에서 DAO, VO, SERVICE  순순한 자바로부터 상속, 
=> POJO가 아닌 애는 HTTPServlet을 상속받은 Controller가됩니다.  

ü트랜잭션 처리를 위한 일관된 방법을 제공
ü영속성 - MyBatis, Hibernate, JPA등과 같은 프레임워크와의 연동을 지원
ü편리한 MVC 구조를 가지고 있고 WAS에 종속되지 않는 개발 환경
ü2.5버전에서 어노테이션을 이용한 설정 지원
ü3.0에서는 Java 클래스를 이용한 설정 지원
ü4.0에서는 REST 방식의 Controller 지원


v스프링 프로젝트 종류

üSpring Boot를 이용(Spring Starter Project): 최대한 간단하게 실행하고 배포가 가능한 수준의 애플리케이션을 만들 때 사용하는데 WAS 설정없이 실행이 가능하기 때문에 테스트 하기에 편리하지만 기존의 웹 프로젝트 설정과 다른 방법으로 사용하며 JSP 설정은 별도로 수행 <작은 프로젝트에서 사용>

üSpring Template Project 이용(Spring Legacy Project): WAS를 사용하거나 이전에 Spring Project를 만들어본 경우 사용하는 방식인데 WAS로 인한 리소스 소모가 심하다는 단점이 있지만 기존 프로젝트들이 이 방식으로 많이 만들어져 있음 <큰 프로젝트에서 사용>






'Java > 스프링' 카테고리의 다른 글

Spring 2-2 TEST 디렉토리 사용  (0) 2018.04.09
Spring 2-1 Property(속성)  (0) 2018.04.09
Spring 1- 2 DI와 IOC ,@Component @Bean 사용 정리  (0) 2018.04.06
DI(Dependency Injection)  (0) 2018.04.05
Spring 1-1) IOC 제어의 역전  (0) 2018.04.05




set abstractSet에는 equals와 hashcode() removeAll()을 가진 추상클래스 입니다. 


내용참조 주소 

출처 : http://tcpschool.com/java/java_collectionFramework_set

'Java > 자바 공부' 카테고리의 다른 글

다형성 인터페이스와 클래스의 차이  (0) 2018.04.17
JAVA 에서 데이터베이스 사용하는 종류  (0) 2018.04.09
Java의 접근 지정자  (0) 2018.04.04
클래스와 인스턴스와 생성자 정의  (0) 2018.02.12
테이블  (0) 2018.02.06

자바의 접근지정자 





1. 자바의 4가지 접근 지정자 


1. private - 클래스 내부에서만 사용가 능한 접근지정자 

                - 만약 변수를 Private로 만든 후 상위클래스를 상속받으면  상속은 되지만, 하위 클래스에서 사용할 수 없습니다.

2. default (pakage) - 패키지 내에서는 public 패키지 외에서 private 

- 자신의 패키지 내에서만 사용이 가능합니다. 

3.protected - 패키지 내에서는 public  외부에서는 클래스내부와 상속받은 클래에서만 사용이 가능합니다. 


4. public -클래스 내부 하위클래스 전부 사용가능  인스턴스 사용가능 



'Java > 자바 공부' 카테고리의 다른 글

JAVA 에서 데이터베이스 사용하는 종류  (0) 2018.04.09
Set에 대해서 공부  (0) 2018.04.04
클래스와 인스턴스와 생성자 정의  (0) 2018.02.12
테이블  (0) 2018.02.06
main  (0) 2018.01.29

1. 클래스와 객체

- 클래스의 정의 : 객체를 정의해 놓은 것

- 클래스의 용도 : 객체를 생성하는데 사용

- 객체의 정의 : 실제로 존재하는 것 (사물 또는 개념)

- 객체의 용도 : 객체의 속성과 기능에 따라 다름

- 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다.

- 하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워지는 것과 같기 떄문이다.

- JDK에서는 많은 수의 유용한 클래스(API)를 기본적으로 제공하고 있다.


2. 객체와 인스턴스

- 객체는 인스턴스를 포함하는 일반적인 의미

- 인스턴스화 : 클래스로부터 인스턴스를 생성하는 것

- 클래스 > 인스턴스화 > 인스턴스(객체)


3. 객체의 구성요소

- 객체는 다수의 속성과 다수의 기능 두 종류의 구성요소로 이루어진다.

- 객체는 속성과 기능의 집합이며, 속성과 기능을 객체의 멤버라고 한다.

- 속성(Property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

- 기능(function) : 메서드(method), 행위(behavior), 함수(function)


4. 인스턴스의 생성

- 클래스명 참조변수명 = new 클래스명();

- 클래스의 객체를 참조하기 위한 참조변수를 선언하고 객체를 생성 후, 객체의 주소를 참조변수에 저장한다.

- 인스턴스 초기화 : 인스턴스 변수에 적절한 값을 저장하는 것이다.


5. 생성자(Constructor)

- 클래스이름(타입 변수명, 타입 변수명) { // 인스턴스 생성시 수행될 코드 }

- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메소드' 이다.

- 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용한다.

- 몇가지 조건을 제외하고는 메서드와 같다.

- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

- 생성자의 이름은 클래스의 이름과 같아야 한다.

- 생성자는 리턴값이 없다. void도 쓰지 않는다.

- 기본 생성자(default constructor) : 매개변수가 없는 생성자, 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

- 매개변수가 있는 생성자 : 인스턴스마다 각기 다른 값으로 초기화되어야하는 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용하다.



출처: http://gangzzang.tistory.com/entry/클래스Class-객체Object-인스턴스Instance-생성자Constructor [갱짱.study]

출처: http://gangzzang.tistory.com/entry/클래스Class-객체Object-인스턴스Instance-생성자Constructor [갱짱.study]

'Java > 자바 공부' 카테고리의 다른 글

Set에 대해서 공부  (0) 2018.04.04
Java의 접근 지정자  (0) 2018.04.04
테이블  (0) 2018.02.06
main  (0) 2018.01.29
dao  (0) 2018.01.29

package JTableMake;


import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.table.DefaultTableModel;

import javax.swing.table.TableModel;


public class DataWindowTable extends JFrame {

private static final long serialVersionUID = 1L;


// 기본설정은 항상 생성자에서

public DataWindowTable() {


// 테이블에 출력할 데이터 만들기

// 컬럼이름

String[] columns = { "학생", "장래희망", "나이" };


// 데이터 만들기

String[][] datas = { { "김영진", "DJ", "27" }, { "김민호", "경호원", "28" }, { "김기남", "바텐터", "28" },

{ "모인재", "바리스타", "28" }


};


// 데이터를 테이블에 출력하기 위해서 TableModel로 변경


TableModel model = new DefaultTableModel(datas, columns);


// 위의 데이터를 가지고 테이블을 생성

JTable table = new JTable(model);


// Scrollpane을 생성해서 JTable을 배치하고 중앙에 배치

// 컬럼이 나오지 않는다 이걸 출력하기 위해서

JScrollPane sc = new JScrollPane(table);


add("Center", sc);


JPanel p = new JPanel();

JLabel l = new JLabel("이름");

p.add(l);


JTextField Field = new JTextField(5);


p.add(Field);


JLabel category = new JLabel("분야");

p.add(category);

JComboBox<String> cbdream = new JComboBox<String>();


cbdream.addItem("경호원");

cbdream.addItem("경찰");

cbdream.addItem("의사");

cbdream.addItem("비행사");

p.add(cbdream);


JLabel age = new JLabel("나이");

p.add(age);


JTextField ageput = new JTextField(3);

p.add(ageput);


JButton btn = new JButton("삽입");

p.add(btn);

JButton btn1 = new JButton("삭제");

p.add(btn1);

add("North", p);


setTitle("표만들기");

setBounds(700, 300, 500, 500);

setVisible(true);

setDefaultCloseOperation(EXIT_ON_CLOSE);


// 버튼을 눌렀을 때는 ActionEvent 발생


ActionListener listener = new ActionListener() {


@Override

public void actionPerformed(ActionEvent e) {


// 이벤트 라우팅


switch (e.getActionCommand()) {


case "삽입":

// 입력하거나 선택한 데이터 가져오기


String name = Field.getText();

String age1 = ageput.getText();

String category1 = cbdream.getSelectedItem().toString();

System.out.println(name);

System.out.println(age1);

System.out.println(category1);


// 오류 메세지

if (name.trim().length() < 1) {

JOptionPane.showMessageDialog(null, "이름은 필수 입력", "입력오류", JOptionPane.ERROR_MESSAGE);

// 중간에 빠져나가고 싶으면 리턴을하면됩니다.

return;

}

 

if (age1.trim().length() < 1) {

JOptionPane.showMessageDialog(null, "나이를입력 필수", "입력오류", JOptionPane.ERROR_MESSAGE);

// 중간에 빠져나가고 싶으면 리턴을하면됩니다.

return;

}

// age는 숫자로만 구성되어야합니다.

int i = 0;

while (i < age1.length()) {


char ch = age1.charAt(i);

if (ch < '0' || ch > '9') {

JOptionPane.showMessageDialog(null, "나이는 숫자로만 입력", "입력오류", JOptionPane.ERROR_MESSAGE);

return;

}


i = i + 1;

}


// 데이터 삽입작업

String[] row = { name, category1, age1 };


// 테이블의 모델을 꺼내기

// 형변환한 이유

// JTable의 Model은 DefaultTableModel 클래스 타입인데

// getModel로 리턴받게 되면 TableModel로 리턴되서

// 원래의 자료형으로 형변환해서 사용합니다.

// 테이블에 삽입이 아닌 테이블의 모델이 삽입한 것 

DefaultTableModel m = (DefaultTableModel) table.getModel();

m.addRow(row);

JOptionPane.showMessageDialog(null, "삽입에 성공", "데이터 삽입",JOptionPane.INFORMATION_MESSAGE);

Field.setText("");

age.setText("");

cbdream.setSelectedIndex(0);

break;

case "삭제":

int rownum = table.getSelectedRow();

//선택이 안된경우는 음수값

if(rownum<0) {

JOptionPane.showMessageDialog(null, "삭제할 행을 선택하세요", "데이터 삭제",JOptionPane.INFORMATION_MESSAGE);

return;

}

// Confirm 대화상자 출력 

int r =  JOptionPane.showConfirmDialog(null, "정말로삭제? ","데이터삭제",JOptionPane.YES_NO_CANCEL_OPTION);

if(r==0) {

DefaultTableModel m1 = (DefaultTableModel)table.getModel();

m1.removeRow(rownum);

JOptionPane.showMessageDialog(null, "삭제완료","삭제",JOptionPane.INFORMATION_MESSAGE);

}


break;

}


}


};

btn.addActionListener(listener);

btn1.addActionListener(listener);

}


}



'Java > 자바 공부' 카테고리의 다른 글

Java의 접근 지정자  (0) 2018.04.04
클래스와 인스턴스와 생성자 정의  (0) 2018.02.12
main  (0) 2018.01.29
dao  (0) 2018.01.29
view  (0) 2018.01.29

package java18_0129;


import java.util.List;


public class Main {


public static void main(String[] args) {


SingerDao dao = SingerDao.sharedInstance();


SingerView view = new SingerView();

while (true) {

String menu = view.menuDisplay();

switch (menu) {

case "1":

List<Singer> list = dao.getSingerlist();

view.listView(list);

break;

case "2":

String userid = view.setSingerUserId();

Singer s = dao.lookUserid(userid);

// 껍데기 형태로 있다.

view.singerDisplay(s);

break;

case "3":

Singer singerinput = view.insertview();

int r = dao.insertSinger(singerinput);

if (r > 0) {

System.out.println("성공");

List<Singer> list1 = dao.getSingerlist();

view.listView(list1);

break;

} else {

System.out.println("삽입에 실패했습니다");

}

case "4":

Singer update = view.UpdateView();

r = dao.UpdateSinger(update);

if (r > 0) {

System.out.println("수정완료");

Singer singer4= dao.lookUserid(update.getUserid());

view.singerDisplay(singer4);

} else {

System.out.println("수정실패");

}

break;

case "5":

userid = view.deleteView();

r = dao.deleteSinger(userid);

if (r > 0) {

System.out.println("삭제 성공");


break;

} else {

System.out.println("실패");

}

}

}

}

}



'Java > 자바 공부' 카테고리의 다른 글

클래스와 인스턴스와 생성자 정의  (0) 2018.02.12
테이블  (0) 2018.02.06
dao  (0) 2018.01.29
view  (0) 2018.01.29
스트링을 숫자로 바꾸기  (0) 2018.01.21

package java18_0129;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;


public class SingerDao implements SingerDB {

// 생성자를 private으로 만듭니다.

private SingerDao() {

}


// 자신의 클래스 타입으로 된 static 변수를 생성

private static SingerDao dao;


// 앞에서 만든 static 변수가 null 일 때만 객체를 생성하고

// 리턴하는 static 메소드를 생성

public static SingerDao sharedInstance() {

if (dao == null) {

dao = new SingerDao();

}

return dao;

}


// 데이터베이스 사용에 필요한 변수를 선언

private Connection con;

private PreparedStatement pstm;

private ResultSet rs;


// 데이터 베이스 연결 메소드

private void connect() {

try {

con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.200:1521:xe", "scott", "tiger");

System.out.println("<★Connect Complete★>");

} catch (Exception e) {

System.out.println("예외(커넥트문제)" + e.getMessage());

e.printStackTrace();

}

}


private void close() {

try {

if (rs != null)

rs.close();

if (pstm != null)

pstm.close();

if (con != null)

con.close();

} catch (Exception e) {

System.out.println("예외(Close문제)" + e.getMessage());

e.printStackTrace();

}


}


// 전체보기 : Singer 테이블의 데이터를 전부 가져와서 리턴해주는 메소드

// 테이블의 데이터를 가져올 때는 매개변수 자리에 데이터가 필요가 없다.

// 세로로 여러개가 나올거 같으면, List

public List<Singer> getSingerlist() {

// 여러 개의 데이터를 저장할 List를 생성

List<Singer> list = new ArrayList<Singer>();

// Singer 테이블의 전체 데이터를 가져오는 SQL

String sql = "select userid, username, age, birthday from singer order by userid";

try {

// 데이터베이스 연결

connect();

// SQL 실행 객체 생성

pstm = con.prepareStatement(sql);

// select 구문 실행

rs = pstm.executeQuery();

// 데이터 읽기

while (rs.next()) {


Singer singer = new Singer();

singer.setUserid(rs.getString("userid"));

// 공백제거를 위한 trim

singer.setUsername(rs.getString("username").trim());

singer.setAge(rs.getInt("age"));

singer.setBirthday(rs.getDate("birthday"));


list.add(singer);


}

} catch (Exception e) {


System.out.println("예외" + e.getMessage());

e.printStackTrace();

} finally {

close();

}

return list;


}


// 상세보기 : Singer 테이블에서 userid를 가지고

// 데이터를 찾아오는 메소드

// id를 가지고 하나의 데이터를 가져오는 메소드 

public Singer lookUserid(String userid) {

// 데이터를 못찾으면 null을 리턴하고 데이터를 찾으면

// 그 데이터를 리턴

Singer singer = null;

String sql = "select * from singer where userid=?";

try {

// 데이터베이스 연결

connect();

// SQL 실행 객체 생성

pstm = con.prepareStatement(sql);

// pstm에 값을 바인딩

pstm.setString(1, userid);

// SQL 실행

rs = pstm.executeQuery();

// 읽어온 데이터가 있으면 singer에 대입

while (rs.next()) {

// while문 밖에다가 만들면, 없어도 만들어버리기 때문에 null이 나온다

singer = new Singer();

singer.setUserid(rs.getString("userid"));

singer.setUsername(rs.getString("username").trim());

singer.setAge(rs.getInt("age"));

singer.setBirthday(rs.getDate("birthday"));

}


} catch (SQLException e) {

System.out.println("예외" + e.getMessage());

e.printStackTrace();

} finally {

close();

}

System.out.println(singer);

return singer;

}


/****************** 데이터를 삽입하는 메소드 ********************/

public int insertSinger(Singer singer) {

int result = -1;

String sql = "insert into singer (userid, username, age, birthday) values(?,?,?,?)";


try {

// 데이터베이스 연결

connect();

// 데이터 바인딩 데이터에 값을 집어 넣기

pstm = con.prepareStatement(sql);

pstm.setString(1, singer.getUserid());

pstm.setString(2, singer.getUsername());

pstm.setInt(3, singer.getAge());

pstm.setDate(4, singer.getBirthday());


// sql실행

result = pstm.executeUpdate();


} catch (Exception e) {

System.out.println("예외(삽입메소드)" + e.getMessage());

} finally {

close();

}

return result;

}

/****************** 데이터를 삭제하는 메소드 ********************/

public int deleteSinger(String userid) {

int result = -1;

String sql = "delete singer where userid=? ";

try {

connect();

Singer singer= new Singer();

// 데이터 바인딩해서 넣기 

pstm =con.prepareStatement(sql);

pstm.setString(1, userid);

result = pstm.executeUpdate();

} catch (Exception e) {

System.out.println("예외(삭제메소드)" + e.getMessage());

}finally {

close();

}

return result ;

}

/****************** 데이터를 수정하는 메소드 ********************/

public int UpdateSinger(Singer singer ) {

int result= -1;

//userid 인 데이터를 찾아서 username을 수정

String sql = "update singer set username =? where userid=? ";

try {

connect();

pstm = con.prepareStatement(sql);

pstm.setString(1, singer.getUsername());

pstm.setString(2, singer.getUserid());

result = pstm.executeUpdate();

} catch (SQLException e) {

System.out.println("예외(삭제메소드)" + e.getMessage());

e.printStackTrace();

}finally {

close();

}

return result;

}

}


'Java > 자바 공부' 카테고리의 다른 글

테이블  (0) 2018.02.06
main  (0) 2018.01.29
view  (0) 2018.01.29
스트링을 숫자로 바꾸기  (0) 2018.01.21
꼭공부) 로또번호  (0) 2018.01.21

+ Recent posts