43일차 시작....

조동현·2022년 8월 31일
0

[교육] Spring

목록 보기
4/7
post-thumbnail

📌 Controller 메소드 파라미터

  • 파라미터 종류
    - 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"
}


📌 어노테이션

  • @ 어노테이션
    어노테이션이 붙은 클래스는 그 모양 그대로 사용되지 않고 런타임시에 변형되어서 사용된다.

  • 어떤 변형?
    특정 클래스를 상속 받기도 하고,
    특정 인터페이스를 구현 하기도 하고
    없던 메소드가 만들어지기도 하고,
    없던 필드가 추가 되기도 하고 등등의
    작업이 자동화 되어 있다.

  • 어떤 방식으로 변형할 건가?
    어노테이션의 종류에 따라,
    어노테이션의 파라미터값에 따라,
    특정 방식으로 변형되어 클래스가 사용된다.


📌 http 요청에 따라 다른 처리 방식

  • 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
- 특정 코드를 자동화하여 사용할 수 있도록 도와주는 모듈


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 붙여넣기



📌 Spring에 DB 연동 (SqlSessionTemplate 객체 생성)

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 생성



📌 Spring Bean Container

  • Bean 종류
    - Controller
    - Service
    - Dao
    - SqlSessionTemplate
    ....

  • Bean 관리 방법
    - 위에서 정의된 객체(Bean)들을 Spring이 관리한다.
    - Spring Bean Container에서 beans를 관리한다._

  • 어디서 관리하나?
    servlet-context.xml 에서 Bean들을 관리한다.


📌 Dependency Injection (DI)

  • DI
    필요한 핵심 의존 객체(Bean)필요한 시점에 주입하는 방법

  • servlet-context.xml 예시
    1. SqlSessionTemplate 핵심 의존 객체 생성
    2. 필요 시점에 Dao 파일에 핵심 의존 객체를 주입함
    3. 사용 시, interface type으로 사용한다.
    SqlSessionTemplate 객체는 SqlSession 인터페이스 객체를 구현한 것이다.


📌 DAO 객체 생성 및 관리

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 Mapper

  • SELECT
    - session.selectOne() : row가 하나일 때, 사용하는 메소드 (반환값은 직접 정해줘야함)
    - session.selectList() : row가 여러개일 때, 사용하는 메소드 (반환값은 List< E >)
profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글