본문 바로가기

Spring

Database 연결 (Spring)

0. mysql 라이브러리 확인

- pom.xml 에 올린 mysql 라이브러리가 정상작동하는지  확인
① class로 dbconfig.java 생성
    public class dbconfig {
        Connection con = null;
        public Connection dbinfo() throws Exception{
            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/cms";
            String user = "hana";
            String pass = "hana1234";

            Class.forName(driver);
            this.con = DriverManager.getConnection(url,user,pass);
            return this.con;
        }
    }​
② mainpage2.java에서 확인
          - 밑에 datalist.do 를 실행 시켰을 때 아래이미지의 출력 결과 나오면 제대로 로드된것.
    @Controller
    public class mainpage2 {
        @GetMapping("/datalist.do")
        public String datalist() {
            dbconfig dc = new dbconfig();
            try {
                Connection con = dc.dbinfo();
                System.out.println(con);
                con.close();
            } catch (Exception e) {
                System.out.println("db연결오류");
            }
            return null;
        }
    }​
db라이브러리 정상 작동 확인

 

1. DB 연결 (Mysql)

1-1. 연결 형태 

XML 형태의 DB 연결 (Maven 형태의 프로젝트)
     - XML형태 DB 연결 시 필요한 라이브러리 (필수)
          ⒜ MysqlConnect/J
          ⒝ spring-jdbc : (@ 이용하여 Resource 형태로 구성하기 위해)
          ⒞ DBCP (Database Connection Pool) - Spring, Spring-boot 에서만 사용

Properties + JSTL (Legacy 형태의 프로젝트)

 

1-2. XML 형태의 DB 연결 (Maven 형태)

1. 필요한 라이브러리 pom.xml에 업로드
     - DBCP (Database Connection Pool) 업로드
     - Mybatis 업로드 (Mybatis와 Mybatis Spring은 별개, 각각 업로드 해야함)

 

2. web.xml 에 dbconfig.xml 올리기

3. dbconfig.xml 생성
new file 생성 화면, bean 검색
beans, context, jdbc, mvc 제일 최신 버전으로 선택해주고 finish




4. dbconfig.xml 에 코드 추가작업
     - search 기능 이용해 BasicDataSource 검색 후 참고



     - bean 태그의 id 는 본인 마음대로 , class 를 검색한 것을 참고해서 아래 와 같이 추가
          -> destroy-method ="close" 를 통해 db 는 자동으로 close 되게끔 설정
dbconfig.xml


     - bean 태그 안에 property 태그로 database 접속 정보 추가
dbconfig.xml

5. DB연결 위한 보안 해제
     - webpage.xmlwepspring 패키지 전체에 어노테이션 및 xml에 사용하는 id 값을 연동 할 수 있도록 오픈

         -> db 연결시에 dbconfig.xml 에 있는 아래의 클래스를 로드해야하는데 
dbconfig.xml



     -> ① 처럼 오픈하면 해당 외의 클래스를 로드 할 수 없음 
     -> ② 처럼 패키지 전체를 오픈해야 그 안에 로드해놓은 다른 클래스들을 사용 할 수 있음 
webpage.xml (controller xml)

     - 다른 패키지도 같은 DB 연결 하는 방법 ( shop 이라는 패키지도 동일한 db 연결)


6. do 에 dabases xml 파일로드 , db 연결

     - @Autowired : ⑴ 모든 메소드에 사용할 수 있는 객체 및 Bean을
                                   사용할 수 있도록 의존성 여부 실행하는 어노테이션 ,  두번 세번 사용 x, 한번만 씀
                                ⑵ 단점 : 외부 class를 호출하여 Database를 연결 시 오류발생
                                             -> 해당 클래스 내에서만 사용 가능 (그래서 잘 안씀)
                                             -> Controller 에서만 사용 가능함 (Module 에서는 안됨)
     - BasicDataSource datasource : database 접속정보 xml 파일로드

     - 코드 예시 )  db는 dbconfig,xml 에서 자동으로 close 되므로 나머지만 close해줌
    @Controller
    public class mainpage2 {
        @Autowired 
        BasicDataSource datasource; 

        @GetMapping("/datalist.do")
        public String datalist() {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                conn = this.datasource.getConnection();
                String sql = "select count(*) as ctn from user";
                ps= conn.prepareStatement(sql);
                rs = ps.executeQuery();
                rs.next();
                System.out.println(rs.getString("ctn"));
                System.out.println(this.datasource);
                System.out.println(conn);
                ps.close();
		rs.close();

            } catch (Exception e) {
                System.out.println(e);
                System.out.println("db 접속 오류");
            }
            return null;
        }
    }​
출력 결과

 

1-3. Legacy project DB 연결

0. legacy project 생성은 아래링크
https://mindiit.tistory.com/126

1. pom.xml

     - 열어보면 도메인 기준인것을 확인할 수 있음 (maven과는 다르게)
     - 데이터 베이스 관련 라이브러리, lombok 등 빠져있는 라이브러리 세팅해줌 (jdk-11,.2024-07기준)
          -> spring-jdbc, commons-fileupload, mysql, lombok, dbcp, tomcat
얘는 Aspect J바로 위에 올려줌, 나머지는 dependencies 시작하는 부분에 추가해주면 됨

 

dbcp2 불러오면 안됨!!!
현재 쓰고있는 apache 버전과 동일한 버전 가져와야함

2. web.xml
     - 한글 깨짐 방지 추가

characterEncodingFilter 검색해서 뜨면 편하게 복붙해서 web,xml에 추가
     - dbconfig.xml 코드 추가


3. dbconfig.xml 생성

    -> appServlet 디렉토리안에 dbconfig.xml 생성
4. dbconfig.properties 생성
     -> WEB-INF 디렉토리 안의 classes 에 생성

    -> properties 안에 코드 추가 (db정보 작성)
          - properties 작성 시 문장의 끝 뒤에 절대 공백이 있으면 안됨


5.  dbconfig.xml에 db 정보 불러오기
     -> 아래처럼 코드 추가
    -> properties 활용해서 가져옴 : 보안상 좋음 (db 뚫리는 일이 거의 없음)
     -> property - placeholder : jstl 형태로 쓸 수 있게 함 

6. 연결 확인
     -> 여기다가 임시로 test 진행
    @Controller
    public class HomeController {

        private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

        @Autowired
        BasicDataSource dbinfo;

        @RequestMapping("/test.do")
        public void test() throws Exception {
            try {
                Connection con = dbinfo.getConnection();
                System.out.println(con);
            } catch (Exception e) {
                System.out.println("db연결 오류");
            }
        }	
    }
     ->  System.out.println(con); 하고 콘솔에 db 정보 찍히면 연결 성공

db 정보 잘 찍힘

   

2. 응용문제. datasource 를 이용하여 해당 정보를 db 에 insert 하시오

2-1. 내가 작성한 코드


1. member.jsp 생성 (데이터 입력받는 파트)
     - 해당 코드 ) 
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@ taglib prefix="aaa" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>회원가입 JSTL + Spring + Datasource</title>
    </head>
    <body>
    <form id="frm" method="post" action="./memberok.do">
    아이디 : <input type="text" name="mid"><br>
    패스워드 : <input type="password" name="mpass"><br>
    고객명 : <input type="text" name="mname"><br>
    <input type="button" value="간편 회원 가입" onclick="join()"><br>
    </form>
    </body>
    <script>
    function join() {
        frm.submit();
    }
    </script>
    </html>​
  2. memberok.do 생성 (데이터 insert 파트)
     - 풀이 코드 ) 
    @Controller
    public class mainpage2 {
        @RequestMapping(value="/memberok.do" ,method=RequestMethod.POST)
        public String memberok(String mid, String mpass, String mname,
        HttpServletResponse res) {
            Connection con = null;
            PreparedStatement ps = null;
            PrintWriter pw = null;;	
            try {
                con = this.datasource.getConnection();
                String sql = "insert into user(uidx,uid,upass,uname,ujoin) "
                        + "values('0','"+mid+"','"+mpass+"','"+mname+"',now())";
                ps= con.prepareStatement(sql);
                int result = ps.executeUpdate();

                pw = res.getWriter();
                if(result>0) {
                    pw.write("<script>"
                            + "alert('리뷰가 정상적으로 등록되었습니다.');"
                            + "</script>");
                }
            } catch (Exception e) {
                System.out.println("접속 오류");
                e.printStackTrace();
            }
            return null;
        }
    }​
 

 

 

2-1. DAO 이용한 코드

1. db 구조부터 확인 (컬럼 구조 파악하기 위함)



1. getter, setter 로 데이터 값 받기 위해 dao 생성 (새로운 클래스로 member_dao.java 생성)
     -> dao 에 컬럼명 과 동일하게 변수 선언
     -> DAO 사용하려면 name도 컬럼명과 동일하게 맞춰줘야함
    @Setter
    @Getter
    public class member_dao {
        int uidx;
        String uid,upass,uname,ujoin;
    }​

2. name을 컬럼명과 동일하게 설정



3. memberok.do 코드 작성 (데이터 db에 저장하는 파트)
    @Controller
    public class mainpage2 {
        @RequestMapping(value="/memberok.do" ,method=RequestMethod.POST)
        public String memberok(@ModelAttribute("mb") member_dao dao) {
            Connection con = null;
            PreparedStatement ps = null;
            try {
                con = this.datasource.getConnection();
                String sql = "insert into user values('0',?,?,?,now())";
                ps = con.prepareStatement(sql);
                ps.setString(1, dao.getUid());
                ps.setString(2, dao.getUpass());
                ps.setString(3, dao.getUname());
                int result = ps.executeUpdate();
                if(result>0) {
                    System.out.println("db 저장 성공");
                }
                ps.close();
            } catch (Exception e) {
                System.out.println("접속 오류");
                e.printStackTrace();
            }
            return null;
        }
    }​


'Spring' 카테고리의 다른 글

Spring - 쿠폰 생성 프로세서  (0) 2024.07.10
legacy project 생성  (0) 2024.07.09
JSTL 사용법  (0) 2024.07.09
Spring 의 Controller  (0) 2024.07.09
웹 경로에서 프로젝트 명 빼기  (0) 2024.07.08