개발/Spring

[Spring] spring postgresql DB 연동

Chikaka 2021. 3. 19. 16:48

#Spring Tool Suite 4

#PostgreSQL 13 (pgAdmin 4)

 

 

 

 

1. DB 준비

 

CREATE TABLE account (
account_idx INTEGER PRIMARY KEY,
id character(8)
)

INSERT INTO account
VALUES ('1','test');

SELECT * FROM account;

 

 

 

일단 test DB는 준비 완료

 

 

 

2. Spring

 

 

DB연동을 위해 건들일 파일들이다.

(지금 저기에 빨간 x표는 신경 안써도 됨)

본인에게 현재 없는 파일들은 직접 만들어야 한다.

파일을 넣을 패키지 오른쪽 마우스 클릭 -> New -> File -> File name에 확장명까지 모두 기입 (ex. sql.xml)

 

(참고)

sql.xml은 sql 패키지를 만든 후 그 안에 넣어줬다.

 

 

 

pom.xml

<!-- PostgreSQL 13.2 -->

    <dependency>

        <groupId>org.postgresql</groupId>

        <artifactId>postgresql</artifactId>

        <version>42.2.18</version>

    </dependency>

    <!-- MyBatis 3.4 -->

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis</artifactId>

        <version>3.4.1</version>

    </dependency>

    <!-- MyBatis-Spring 1.3-->

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis-spring</artifactId>

        <version>1.3.0</version>

    </dependency>

    <!-- Spring-JDBC -->

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

        <version>${org.springframework-version}</version>

    </dependency>

<dependencies></dependencies>를 찾아서 그 사이에 넣어주면 된다.

 

참고로 나는 블로그에서 이 코드를 가져올 때

그사람은 PostgreSQL 9.4라서 <version>9.4.1209.jre6</version>라고 적어줬지만

나는  PostgreSQL 13.2이기 때문에 <version>42.2.18</version>로 적어줘야 했다.

각 버전을 확인하고 적용하길 바란다! (이거 때문에 이틀을 버림...)

 

 

 

 

jdbc.properties

jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/myapp

jdbc.username=postgres
jdbc.password=0000

 

여기서 주의해야할 점은 url부분이다.

jdbc.url=jdbc:postgresql://localhost:5432/myapp

여기에서 내가 쓴 myapp은 나의 데이터베이스 이름이다.

 

요부분을 써주면 된다.

 

그리고 username과 password도 각자에게 맞게 적어주면된다.

 

 

 

 

root-context.xml

DB 연동 정보 및 SQL 설정을 추가해준다.

<?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 https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
		<!-- properties -->

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations" value="classpath:/jdbc.properties" />
        <property name="fileEncoding" value="UTF-8" />
    </bean>

    <!-- JDBC-PostgreSQL -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>    

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    	<property name="mapperLocations" value="classpath*:sql/**/*.xml"/>  
    	<property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 
    	<constructor-arg index="0" ref="sqlSessionFactory" /> 
    </bean>
</beans>

 

 

 

sql.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="sql">
<select id="sel" resultType="com.mycompany.myapp.HomeDto">     <!-- resultType은 HomeDto 위치 -->

	SELECT * FROM account

</select>
</mapper> 

 

resultType 부분은 HomeDto의 위치를 적어주면된다. 앞은 패키지 명이다.

id는 HomeDao에서 함수로 불러오는 데 사용된다.(ex. sel() )

따라서 HomeDao에서와 같게 적어줘야한다.

namesapce도 마찬가지로 HomeDao에서 필요한 부분이다. (ex. "namespace.id" 형태)

HomeDao.java 코드를 보면 쉽게 이해될 것이다.

 

두 곳 이름이 다르지 않게 주의해야한다!!

아니면 에러가 나서 하루종일 오탈자를 찾아봐야할 수도...

 

 

 

 

HomeController.java

package com.mycompany.myapp;

import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**

 * Handles requests for the application home page.

 */

@Controller

public class HomeController {
	@Autowired
	HomeDao homeDao;

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

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {
		List<HomeDto> list = homeDao.sel();
		for(int i=0; i<list.size(); i++){
			logger.info(list.get(i).getAccount_idx());
			logger.info(list.get(i).getId());
			model.addAttribute("ID", list.get(0).getId() );
		}
		return "home";
	}	
}

 

 

 

HomeDao.java

package com.mycompany.myapp;

import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class HomeDao {
	@Autowired
	private SqlSessionTemplate sqlSession;

	public List<HomeDto> sel(){
		return sqlSession.selectList("sql.sel");	

	}

}

 

 

 

HomeDto.java

DB 불러오는 곳

package com.mycompany.myapp;

public class HomeDto {
	private String account_idx;
	private String id;
	
	public String getAccount_idx(){
		return account_idx;
	}
	public void setAccount_idx(String account_idx){
		this.account_idx=account_idx;
	}
	public String getId(){
		return id;
	}
	public void setId(String id){
		this.id=id;
	}
}

 

 

 

home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  ID is ${ID}. </P>

</body>
</html>

 

 

 

 

 

3. Start the server

localhost:8080 접속

(뒤에 /myapp은 나의 패키지 마지막 부분 ex.com.mycompany.myapp)

 

나오면 성공!

(404에러-요청된 리소스 [/]은(는) 가용하지 않습니다. 라는 에러 페이지 나오면 밑에 링크 참조)

 

 

콘솔 로그 

INFO : com.mycompany.myapp.HomeController - 1
INFO : com.mycompany.myapp.HomeController - test   

 

 

 

 

 

 

4. 에러 발생시

 

!!오타 찾기!!

 

① pom.xml - 각 버전 본인과 맞는지 확인

② jdbc.properties - url에서 본인 database 이름 맞는지 확인, 본인 DB username & password 맞는지 확인

③ sql.xml - namespaceid가 HomeDao에서의 namespace, id와 일치하는지 확인

④ HomeController.java - homeDao.sel() 이부분의 sel()이 HomeDao.java에 있는 함수명과 같은지 확인

 

(나의 경우는 첫번째, 버전 오타였다...!)

 

 

 

 

이외 나올 수 있는 에러 해결방법

 

https://chikaka-dev.tistory.com/12

 

요청된 리소스 [/]은(는) 가용하지 않습니다. - 이클립스 톰캣 연동 에러

이클립스에서 톰캣 연동시 이런 에러 메시지가 뜰 때 서버를 더블클릭하면 서버 web modules 관리 창이 뜬다. (왼쪽 아래에 Modules 탭을 클릭하면 나온다.) 거기서 path를 / 로만 설정해준다. 예를 들어

chikaka-dev.tistory.com

chikaka-dev.tistory.com/14

 

[Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException : nested exception is org.apache.ibati

spring 서버를 돌렸는데 SEVERE: 경로 [/myapp]의 컨텍스트 내의 서블릿 [appServlet]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed;..

chikaka-dev.tistory.com

chikaka-dev.tistory.com/11

 

이클립스에서 xml 파일에서 node와 content 만 보일 때

이클립스에서 xml 파일에서 node와 content 만 보일 때! 너무나 당황했지만 당황하지 말고~ 왼쪽 아래에 있는 Source 탭을 클릭하세요. 그러면 우리에게 익숙한 편집창이 나옵니다.

chikaka-dev.tistory.com

chikaka-dev.tistory.com/10

 

cvc-elt.1.a cannot find the declaration of element 'project' - Spring 에러

pom.xml에서 cvc-elt.1.a cannot find the declaration of element 'project' 에러가 나올 경우 schemaLocation 중에서 아무거나 한글자 바꾸고 저장 -> 다시 원래대로 하고 다시 저장 하면 에러가 사라진다.

chikaka-dev.tistory.com

 

 

 

참고 : osc131.tistory.com/48