- 파라미터 종류
- HttpServletRequest의 getParameter()를 사용하여 요청 시 전달값 받기
- 요청 시 전달값의 변수명과 동일한 변수명으로 파라미터 사용
- 요청 시 전달값들의 변수명 및 개수가 정확히 DTO 객체의 필드와 동일할 때 DTO로 받기// HttpServletRequest 사용 @RequestMapping("/test1") public String test(HttpServletRequest req) { String test = req.getParameter("testValue"); return "testPage" } // 동일 변수명 사용 @RequestMapping("/test1") public String test(String testValue) { String test = testValue; return "testPage" } // DTO 사용 @RequestMapping("/test1") public String test(TestDto dto) { String test = dto.getTestValue(); return "testPage" }
- @ 어노테이션
어노테이션이 붙은 클래스는 그 모양 그대로 사용되지 않고 런타임시에 변형되어서 사용된다.
- 어떤 변형?
특정 클래스를 상속 받기도 하고,
특정 인터페이스를 구현 하기도 하고
없던 메소드가 만들어지기도 하고,
없던 필드가 추가 되기도 하고 등등의
작업이 자동화 되어 있다.
- 어떤 방식으로 변형할 건가?
어노테이션의 종류에 따라,
어노테이션의 파라미터값에 따라,
특정 방식으로 변형되어 클래스가 사용된다.
- GET
- 주소 창에 직접 요청 경로를 입력
- 링크를 클릭무조건 GET 방식
- http 요청에 따라 다른 처리 방식
- 같은 요청 주소로 요청 시, 다른 http 처리 방식을 사용하면 같은 주소 이름을 맵핑할 수 있다.// GET @RequestMapping(value="/test", method=RequestMethod.GET) public String test() { return "testPage" } // POST @RequestMapping(value="/test", method=RequestMethod.POST) public String test() { return "testPage" }
MyBatis
- 특정 코드를 자동화하여 사용할 수 있도록 도와주는 모듈
MyBatis 모듈 가져오기
1. MyBatis 에서 xml 일부 복사<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
2. com.패키지명.프로젝트 폴더 내부에 폴더 추가
- com.패키지명.프로젝트.mybatis 폴더 생성
3. Configuration.xml 파일 생성
- 폴더 우클릭 → new → others → xml → 파일 생성하기
4. Configuration.xml 파일 수정<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
해당 xml 붙여넣기
1. servlet-context.xml 파일 수정
sessionFactory 객체 생성 시, 설정 정보를 변경해야 한다.<!-- JNDI 데이터 소스 객체 얻어오는 설정 Servers/context.xml 에 설정된 oracle 접속정보 가 있어야 된다. <Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:xe" username="scott" password="tiger" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/> --> <beans:bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <beans:property name="jndiName" value="java:comp/env/jdbc/myoracle"/> </beans:bean> <!-- 위는 아래의 코드와 같다 dataSource = new JndiObjectFactoryBean(); dataSource.setJndiName("java:comp/env/jdbc/myoracle"); --> <!-- SqlSessionFactory 객체 Configuration.xml 문서가 어디에 있는지 알려야 한다. --> <beans:bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <beans:property name="dataSource" ref="dataSource"/> <beans:property name="configLocation" value="classpath:com/패키지명/프로젝트명/mybatis/Configuration.xml"/> </beans:bean> <!-- sessionFactory=new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setConfigLocation("classpath:com/gura/xxx"); --> <!-- SqlSession 인터페이스를 구현한 SqlSessionTemplate(SqlSession) 객체 Dao 가 의존하는 객체 --> <beans:bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <beans:constructor-arg name="sqlSessionFactory" ref="sessionFactory"/> </beans:bean> <!-- 위의 bean 설정을 java code 로 환산 하면 아래와 같다 dataSource = new JndiObjectFactoryBean(); dataSource.setJndiName("java:comp/env/jdbc/myoracle"); sessionFactory=new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setConfigLocation("classpath:com/gura/xxx"); new SqlSessionTemplate(sessionFactory); -->
2. Servers/context.xml 파일 수정
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:xe" username="scott" password="tiger" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
3. com.aa.step03 패키지 내부에 패키지 생성
- com.aa.step03.member.dao 생성
- com.aa.step03.member.dto 생성
4. 각 패키지에 Dto, Dao 파일 생성
- MemberDao Interface로 생성
- MemberDto Class로 생성
5. Dao 패키지에 Dao를 구현할 Class 생성
- MemeberDaoImpl Class 생성
- Bean 종류
- Controller
- Service
- Dao
- SqlSessionTemplate
....
- Bean 관리 방법
- 위에서 정의된 객체(Bean)들을 Spring이 관리한다.
- Spring Bean Container에서 beans를 관리한다._
- 어디서 관리하나?
servlet-context.xml 에서 Bean들을 관리한다.
- DI
필요한 핵심 의존 객체(Bean)를 필요한 시점에 주입하는 방법
- servlet-context.xml 예시
1. SqlSessionTemplate 핵심 의존 객체 생성
2. 필요 시점에 Dao 파일에 핵심 의존 객체를 주입함
3. 사용 시, interface type으로 사용한다.
↪ SqlSessionTemplate 객체는 SqlSession 인터페이스 객체를 구현한 것이다.
1. Interface Type의 Dao를 implements 한다.
public class MemberDaoImpl implements MemberDao {}
2. interface에 정의된 메소드를 구현한다.
public class MemberDaoImpl implements MemberDao { @Override public void insert(MemberDto dto) { session.insert("member.insert", dto); } @Override public void update(MemberDto dto) { } @Override public void delete(int num) { } @Override public MemberDto getData(int num) { return null; } @Override public List<MemberDto> getList() { return null; } }
3. 구현 클래스를 Spring Bean Container에서 관리할 수 있도록 한다.
// Dao 객체도 Spring Bean Container에서 관리하도록 어노테이션을 붙인다. @Repository public class MemberDaoImpl implements MemberDao {....}
4. SqlSessionTemplate을 받는 SqlSession interface type 객체를 생성한다.
// Dao 객체도 Spring Bean Container에서 관리하도록 어노테이션을 붙인다. @Repository public class MemberDaoImpl implements MemberDao { // Spring Bean Container 에서 SqlSession Type 객체를 찾아서 주입해(DI) 주세요라는 의미 // Autowired 때문에 Null 값을 갖지 않는다. @Autowired private SqlSession session; .... }
5. 구현한 메소드 내부에서 기능에 따라 SqlSession 문법을 사용한다.
- session : SqlSession interface 타입의 객체
- insert : SqlSessionTemplate 클래스의 메소드
- 첫번째 인자 : mapper에 정의한 "namespace.id"를 명시
- 두번째 인자 : mapper에 정의한 parameterType의 인자값으로 매핑할 수 있도록 지정@Override public void insert(MemberDto dto) { session.insert("member.insert", dto); }
6. Configuration.xml 파일이 있는 mybatis 패키지 내부에 xml 파일 생성
- 해당 xml 파일은 DB연동 및 DML을 컨트롤하는 파일이다.
- 파일명 : MemberMapper.xml
- namespace : mybatis mapper 객체명
- insert 태그의 id : mybatis mapper 메소드명
- parameterType : 사용할 DTO 객체 경로
- #{필드명} : Dto에서 정의된 필드명을 작성
- 내부에 DML 문법을 작성<?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="member"> <insert id="insert" parameterType="com.aa.step03.member.dto.MemberDto"> INSERT INTO member (num, name, addr) VALUES (member_seq.NEXTVAL, #{name}, #{addr}) </insert> </mapper>
7. MemberMapper.xml 파일을 사용할 수 있도록 Configuration.xml에 명시한다.
- mapper resource : MemberMapper.xml이 있는 경로를 작성<configuration> <mappers> <mapper resource="com/aa/step03/mybatis/MemberMapper.xml"/> </mappers> </configuration>
8. 실제 사용하는 Controller에서 Dao Interface type 객체를 DI 주입한다.
- 결과적으로 실제 Dao를 구현한 클래스와의 의존관계가 약해진다.@Controller public class MemberController { // MemberDaoImpl 클래스 객체를 Interface type 객체에 DI 주입한다. @Autowired private MemberDao dao; @RequestMapping("/member/list.do") public String getList(HttpServletRequest req) { List<MemberDto> list = dao.getList(); req.setAttribute("list", list); return "member/list"; } }
- SELECT
- session.selectOne() : row가 하나일 때, 사용하는 메소드 (반환값은 직접 정해줘야함)
- session.selectList() : row가 여러개일 때, 사용하는 메소드 (반환값은 List< E >)