java
스프링
rewind
2024. 2. 6. 14:54
ContactInfo insert 확인하기
@Validation 어노테이션 사용해서
폼태그로 에러메세지 출력 확인하기
<?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="kr.or.ddit.mapper.ContactInfoMapper">
<!-- mapper인터페이스의 메소드명과 mapper xml의 id와 동일 -->
<insert id="insert" parameterType="contactInfoVO">
<selectKey resultType="String" order="BEFORE" keyProperty="ciCd">
SELECT NVL(SUBSTR(MAX(CI_CD),1,10) || TRIM(TO_CHAR(SUBSTR(MAX(CI_CD),-3)+1,'000')),
'CI' || TO_CHAR(SYSDATE,'YYYYMMDD') || '001')
FROM CONTACT_INFO
WHERE CI_CD LIKE 'CI' || TO_CHAR(SYSDATE,'YYYYMMDD') || '%'
</selectKey>
insert into contact_info (CI_CD, CI_NAME, CI_MAIL, CI_SUBJ, CI_IMG_URL, CI_MESG, CI_REG_DT, REGISTER_ID, REGIST_DT)
values(#{ciCd} ,#{ciName} , #{ciMail} , #{ciSubj} , #{ciImgUrl} ,#{ciMesg} , #{ciRegDt} , 'admin' , sysdate)
</insert>
</mapper>
트랜잭션
한 트랜잭션 진행시 종료되기 전까지 select(조회)만 가능(insert , delete , update 불가)
스프링에서 트랜잭션 처리하기
servlet-context.xml
root-context.xml에 추가 작성
xmlns:tx="http://www.springframework.org/schema/tx"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
--------------------------------------------------------------------------------------------------------------
<!-- 파일업로드 디렉토리 설정 아래쪽에 작성 -->
<!-- 트랜잭션 관리자의 빈을 정의 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 어노테이션 기반의 트랜잭션 제어를 활성화함 -->
<tx:annotation-driven/>
스프링에서 트랜잭션 관리를 대신 해준다 -> 해당 메소드에 @Transactional 선언
<?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="kr.or.ddit.mapper.ContactInfoMapper">
<!-- mapper인터페이스의 메소드명과 mapper xml의 id와 동일 -->
<insert id="insert" parameterType="contactInfoVO">
<selectKey resultType="String" order="BEFORE" keyProperty="ciCd">
SELECT NVL(SUBSTR(MAX(CI_CD),1,10) || TRIM(TO_CHAR(SUBSTR(MAX(CI_CD),-3)+1,'000')),
'CI' || TO_CHAR(SYSDATE,'YYYYMMDD') || '001')
FROM CONTACT_INFO
WHERE CI_CD LIKE 'CI' || TO_CHAR(SYSDATE,'YYYYMMDD') || '%'
</selectKey>
insert into contact_info (CI_CD, CI_NAME, CI_MAIL, CI_SUBJ, CI_IMG_URL, CI_MESG, CI_REG_DT, REGISTER_ID, REGIST_DT)
values(#{ciCd} ,#{ciName} , #{ciMail} , #{ciSubj} , #{ciImgUrl} ,#{ciMesg} , #{ciRegDt} , 'admin' , sysdate)
</insert>
<resultMap type="contactInfoVO" id="contactInfoMap">
<result property="ciCd" column="CI_CD"/>
<result property="ciName" column="CI_NAME"/>
<result property="ciMail" column="CI_MAIL"/>
<result property="ciSubj" column="CI_SUBJ"/>
<result property="ciImgUrl" column="CI_IMG_URL"/>
<result property="ciMesg" column="CI_MESG" jdbcType="CLOB" javaType="java.lang.String"/>
<result property="ciRegDt" column="CI_REG_DT"/>
<result property="registerId" column="REGISTER_ID"/>
<result property="registDt" column="REGIST_DT"/>
</resultMap>
<!-- 방문 상세 -->
<select id="detail" parameterType="String" resultMap="contactInfoMap">
select CI_CD, CI_NAME, CI_MAIL, CI_SUBJ, CI_IMG_URL, CI_MESG, CI_REG_DT, REGISTER_ID, REGIST_DT
from contact_info
where ci_cd = #{ciCd}
</select>
</mapper>
DB에서 컬럼 타입이 CLOB일때는 아래와 같이 타입 처리 해줘야 함
<result property="ciMesg" column="CI_MESG" jdbcType="CLOB" javaType="java.lang.String"/>
detail.jsp 생성
ContactInfoController에 detail 메소드 작성
/*
요청URI : /contactInfo/detail
요청파라미터 : ciCd=CI20240206001
요청방식 : get
*/
// <form:form modelAttribute="contactInfoVO"
@GetMapping("/detail")
public String detail(ContactInfoVO contactInfoVO) {
log.info("detail -> contactInfoVO : " + contactInfoVO);
//forwarding : jsp
return "contactInfo/detail";
}
detail.jsp 페이지 만들어보기
스프링 AOP
Aspect Oriented Programing
로그
보안
트랜잭션
에러
스프링내에서 관리해줌
횡단관심사의 분리
여러 모듈에서 공통적이고 반복적인 처리를 요구하는 부분을 한곳으로 모은다
form.xml -> aop dependency 추가 jrt는 이미 있으므로 생략 가능
<!-- AOP(Aspect Oriented Programming : 관점 지향 프로그래밍) 시작
1) aspectjrt => 이미 있으므로 생략
2) aspectjweaver => 없으므로 의존 관계를 정의
-->
<!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver
1.5.4 -->
<!-- AspectJ Weaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- AspectJ Tools -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- AOP(Aspect Oriented Programming : 관점 지향 프로그래밍) 끝 -->
maven build - root-context.xml 아래 내용 작성
<!-- 스프링 AOP 활성화 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- kr.or.ddit.aop 패키지를 컴포넌트 스캔 대상으로 등록 -->
<context:component-scan base-package="kr.or.ddit.aop"></context:component-scan>
윗부분에 xmlns 변경
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
kr.or.ddit.aop 패키지 생성