[Spring] spring postgresql DB 연동
#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 - namespace와 id가 HomeDao에서의 namespace, id와 일치하는지 확인
④ HomeController.java - homeDao.sel() 이부분의 sel()이 HomeDao.java에 있는 함수명과 같은지 확인
(나의 경우는 첫번째, 버전 오타였다...!)
이외 나올 수 있는 에러 해결방법
https://chikaka-dev.tistory.com/12
요청된 리소스 [/]은(는) 가용하지 않습니다. - 이클립스 톰캣 연동 에러
이클립스에서 톰캣 연동시 이런 에러 메시지가 뜰 때 서버를 더블클릭하면 서버 web modules 관리 창이 뜬다. (왼쪽 아래에 Modules 탭을 클릭하면 나온다.) 거기서 path를 / 로만 설정해준다. 예를 들어
chikaka-dev.tistory.com
[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
이클립스에서 xml 파일에서 node와 content 만 보일 때
이클립스에서 xml 파일에서 node와 content 만 보일 때! 너무나 당황했지만 당황하지 말고~ 왼쪽 아래에 있는 Source 탭을 클릭하세요. 그러면 우리에게 익숙한 편집창이 나옵니다.
chikaka-dev.tistory.com
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