[포스코DX|Spring|7주] 29일차 수업
포스코DX X 비트교육센터 6기 - Spring
앞으로의 계획
메일 보내기
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
//java mail 보내기
//@Autowired
//private MailSender mailSender;
public void addUser(UserVo vo) {
userRepository.insert(vo);
//mailSender.send(vo.getEmail(), "", "");
}
}
-
메일 보낼 때, 쓰는 포트
-
공부해보기
Repository 문제점
- try - catch(문제) : AOP + RuntimeException (해결)
- BoilerPlate(문제) : Template Pattern(OOP design pattern) (해결)
- Spring JDBC(java code와 SQL) (문제) : mybatis - sql과 java를 분리함. (해결)
mybatis를 이론적인 면
SQL을 중심으로
- parameter mapping을 도와줌
- object(=result) mapping을 도와줌
mapper가 java code와 sql을 분리시키는 역할을 한다.
-
try - catch가 없어짐.
-
간편하게 jdbc를 쓰는 기술
mybatis
- SQLSessionFactory가 SQLSessionTemplate을 포함한다.
try -> [ mybatis ] SQLSessionTemplate
getConnection -> [ mybatis ] SQLSessionTemplate
prepare(SQL)
resultSet
close -> [ mybatis ] SQLSessionTemplate
catch -> [ mybatis ] SQLSessionTemplate
datasource
- pom.xml
<!-- Common DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
- applicationContext.xml
<!-- Connection Pool DataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/webdb" />
<property name="username" value="webdb" />
<property name="password" value="webdb" />
</bean>
- repository
public class GuestbookRepository {
@Autowired //이것 추가!!!
private DataSource dataSource; //여기!!
public List<GuestbookVo> findAll() {
List<GuestbookVo> result = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection(); //여기도!
.
.
.
mybatis 설정
- pom.xml ( mybtis와 spring jdbc 추가)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.poscodx</groupId>
<artifactId>mysite</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>mysite03</artifactId>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.outputEncoding>UTF-8</project.build.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<org-springframework-version>5.3.25</org-springframework-version>
</properties>
<dependencies>
<!-- spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org-springframework-version}</version>
</dependency>
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org-springframework-version}</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- mariadb jdbc driver -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.0.8</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- Common DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<build>
<finalName>mysite03</finalName>
</build>
</project>
- applicationContext.xml
<!--SqlSessionFactory -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="configLocation"
value="classpath:mybatis/configuration.xml" />
</bean>
- 패키지 및 파일 추가
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
</typeAliases>
<mappers>
<mapper resource="mybatis/mappers/guestbook.xml" />
</mappers>
</configuration>
- 패키지 및 파일 생성
<?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="guestbook">
</mapper>
- pom.xml
<!--SqlSession-->
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
- repository에 추가
@Repository
public class GuestbookRepository {
@Autowired
private DataSource dataSource;
@Autowired //여기
private SqlSession sqlSession;
.
.
.
- mappers 안의 xml 파일에 dml 문 작성
alias가 필요함.
<?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="guestbook">
<select id='findAll' resultType="com.poscodx.mysite.vo.GuestbookVo">
select * from guestbook order by no desc
</select>
</mapper>
- repository에 추가
public List<GuestbookVo> findAll() {
List<GuestbookVo> result = sqlSession.selectList("guestbook.findAll");
return result;
}
alias 설정 - configuration.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.poscodx.mysite.vo.GuestbookVo"
alias="guestbookvo" />
</typeAliases>
<mappers>
<mapper resource="mybatis/mappers/guestbook.xml" />
</mappers>
</configuration>
- 이용
<?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="guestbook">
<select id='findAll' resultType="guestbookvo">
select * from guestbook order by
no desc
</select>
<delete id='deleteByNoAndPassword'>
delete from guestbook where no =? and password =?
</delete>
<insert id="insert" parameterType="guestbookvo">
insert into guestbook values(null, #{name }, #{password }, #{contents },
now())
</insert>
</mapper>
mybatis가 제공해주는 alias를 모두 소문자로 해놓았다. 그래서, 내껏도 다 소문자로! ex. map
insert
- GuestbookRepository
public Boolean insert(GuestbookVo vo) {
int count = sqlSession.insert("guestbook.insert", vo);
return count == 1;
}
delete
- xml
<delete id='deleteByNoAndPassword' parameterType="map">
delete from guestbook where no =#{no } and password = #{password }
</delete>
- repository
public Boolean deleteByNoAndPassword(Long no, String password) {
Map<String, Object> map = new HashMap<>();
map.put("no", no);
map.put("password", password);
int count = sqlSession.delete("guestbook.deleteByNoAndPassword", map);
return count == 1;
}
- sqlSession도 삭제!!!