본문 바로가기

비트교육센터[전문가반]

Spring MVC [비트교육센터] _ 복습03

#전송 메소드 종류 

GET     (R)

 

GET /board/10

======body=======

 

POST    (C)

 

POST /board

======body=======

userno=10&title=qweqwe&contents=hello

 

PUT     (U)

 

PUT /board/10

======body======

title=qweqwe&contents=world

 

DELETE  (D)

 

DELETE /board/10

=======body======

 

# 보안(Spring Security)은 처리는 컨트롤러에서 처리하는것이 아니라 Access Control Layer(ACL)에서 처리한다.

=> ACL 은 컨틀롤러에 들어오기 전에 처리한다.

 

# 예외 처리: Runtime Exception 

[GlobalExceptionHandler.java] : Runtime시 모든 예외처리를 담당하는 클래스

=> 예외 발생시 콘솔로 찍어주고, exception.jsp 페이지를 Client에게 보여준다.

 

@ControllerAdvice // 컨트롤러의 Exception 이기때문에 ControllerAdvice 어노테이션 붙여준다.

public class GlobalExceptionHandler {

           // 모든 예외가 모여서 처리하는 메서드

           @ExceptionHandler(Exception.class)

           public void handleException(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {

                     // 1. 로그 작업

                     System.out.println(e);

 

                     // 사과문 페이지로 전달(컨트롤러가 아니기때문에 직접 request를 받아서 dispatcher에 전달해야한다.)

                     request.setAttribute("error", e.toString());

                     request.getRequestDispatcher("/WEB-INF/views/error/exception.jsp").forward(request, response);

           }

}

 

@ControllerAdvice 어노테이션을 스캔하기위해서 spring-servlet.xml 에서 스캔 설정을 해주어야한다.

           <context:component-scan base-package="com.bitacademy.mysite.controller, com.bitacademy.mysite.exception" />

 

# MyBatis 설정

1) confiuration.xml (src/main/resources 폴더내에 만든다.)

(참고, src/main/java는 컴파일되서 올라가고 src/main/resources는 그냥 올라가기에 static파일들이 모여있다.)

           : sql문이 작성되어있는 xml 파일이 mapper 되어 있는 파일

                     - typeAlias (클래스타입 별칭): 원래는 패키지명+클래스명 으로 전부 선언해야하는걸 별칭으로 

                                                            간단하게 만듬

                     - sql문이 적혀있는 .xml파일 맵핑

 

2) user.xml

           : user에 관련된 SQL문이 작성되어있다.

 

3) applicationContext.xml 에서

           - Connection Pool DataSource 빈 등록

                     => driverClassName, url, username, password property로 들어감

           - MyBatis SqlSessionFactory 빈 등록

                     => datatSource 빈 객체가 들어감

                     => sql문이 들어가있는 파일 confiuration 이 들어감

           - MyBatis SqlSession 빈 등록

                     => 생성자로 sqlSessionFactory가 들어감

                     => SqlSession 으로 insert, delete, update 등을 할 수 있다.

                    

ex. [applicationContext.xml] 에서 설정함

 

<!-- Connection Pool DataSource Bean-->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

           <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />

           <property name="url" value="jdbc:mysql://localhost:3306/webdb?characterEncoding=utf8&amp;serverTimezone=UTC" />

           <property name="username" value="root" />

           <property name="password" value="369369" />

</bean>

          

<!-- MyBatis SqlSessionFactory Bean -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

           <property name="dataSource" ref="dataSource" />

           <property name="configLocation" value="classpath:mybatis/configuration.xml" />

</bean>

          

<!-- MyBatis SqlSessionTemplate Bean-->

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

           <constructor-arg index="0" ref="sqlSessionFactory" />

</bean>

          

 

# <![CDATA[ ]]>

=> sql문 쓸때 where 문 비교값(>, <) 에러를 방지

=> CDATA 안에는 sql문 데이터라는 것을 명시

<![CDATA[

                     insert into user

                     values(null, ?, ?, ?, ?, now())

]]>

 

# insert 된 데이터의 pk값을 구하고자 할때

<insert id="insert" parameterType="uservo">

           <![CDATA[

                     insert into user

                     values(null, #{name }, #{email }, #{password }, #{gender }, now())

           ]]>

           <!-- 마지막으로 들어간 데이터의 pk값을 가져온다. 여기서는 위에 쿼리문으로 들어간 데이터의 pk값을 가져온다.-->

           <selectKey keyProperty="no" resultType="long" order="AFTER">

           <![CDATA[

                     select last_insert_id()

           ]]>

           </selectkey>

</insert>

 

# 게시판에 hello 라는 제목이 들어간 게시판을 찾고자할때

           - #{keyword} 로 했을때 SQL: select * from board where title like '"hello"'

                     => ''안에 ""가 또 들어가는 오류를 범한다.

           - ${keyword} 로 했을때 SQL: select * from board where title like 'hello'

                     => 데이터 값으로 치환되는 것을 볼 수있다.

따라서, 제목으로 게시판 검색할떄 '%#{keyword}%' 으로 #을 붙이면 치환이 안되고 ${} 을 붙여서 넣어줘야 치환된다.

 

<select id="find" parameterType="long" resultType="boardvo">

           <![CDATA[

                     select * from board

                     where title like '%${keyword}%'

           ]]>

</select>