스프링에 PROCUDURE 적용해보기

  • 마이바티스가 아닌 일반 dao를 만들 것임
    • 프로시저 호출 방법을 알기 위해서

초기 셋팅

application-context.xml

  • context : 패키지 메모리 할당
  • viewResolver : JSP 찾기

StudentVO.java

  • DTO : 사용자 정의 데이터형
  • total , avg : 사용자 정의 FUNCTION으로 만들어야 한다.
    • INSERT, UPDATE, DELETE 기능은 PROCEDURE로 만들어야 한다.

MainController.java

  • @Controller : RequestMapping을 찾아줘야 하니까 메모리 할당을 해야 한다.
  • MVC구조의 Model역할이다.
    • 요청을 처리하고 결과값을 전송해주는 역할을 담당한다.
  • DAO 객체 받기
  • 각 기능별로 RequestMapping을 활용해서 DAO에서 실행한 결과를 JSP에 전송하기 위해 사용된다.

StudentDAO.java

  • @Repository : DB와 관련된 DAO의 메모리 할당하기 위해 사용한다.

목록 출력하기

StudentDAO.java : studentListData

  • CallableStatement : Procedure를 호출할 때 사용한다.
    • PreparedStatement : 일반 sql문장을 전송할 때 사용한다.
    • 마이바티스를 사용할 때에도 디폴트로 잡혀있는 PreparedStatement를 CallableStatement로 변경해야 한다.
  • 드라이버 등록 , 연결 , 해제

  • pom.xml에서 ojdbc 에러가 발생하는 이유는 maven repository에서 삭제되었기 때문이다.
    • 그래서 직접 ojdbc14를 다운로드 받아서 lib폴더에 넣어줘야 한다.
Tip

메이븐 repository에 없는 외부 라이브러리 추가하기

  • WEB-INF - [lib]에 jar파일 추가하기
  • pom.xml에 추가된 jar파일 등록하기
  • studentListData 클래스 제작

  • registerOutParameter : 저장공간 만들기
  • OracleTypes.CURSOR : select의 결과를 cursor가 갖는다
Note

OracleTypes의 유형

  • int : OracleTypes.INTEGER
  • string : OracleTypes.VARCHAR
  • double : OracleTypes.DOUBLE
  • Date : OracleTypes.DATE
  • ResultSet : OracleTypes.CURSOR

MainController.java : main_list

  • 프로시저 작동 과정은 볼 수가 없음
    • 호출된 결과로 유추할 수 있어야 한다.
    • 만들어진 프로시저를 활용할 수 있어야 한다.

list.jsp

  • studentListData 결과 화면에 출력하기

새 정보 등록하기

StudentDAO.java : studentInsert

  • cs.executeQuery(); : 프로시저의 실행은 무조건 executeQuery이다.
    • commit은 프로시저에 작성해두었기 때문에 따로 또 실행하지 않아도 된다.

MainController.java : main_insert , main_insert_ok

  • insert 실행 후, 완료되면 redirect:list.do 로 응답한다.

list.jsp

  • 총점, 평균 컬럼 추가
  • 수정/삭제 버튼 컬럼 추가
  • 등록 버튼 추가

insert.jsp

  • 학생이름, 과목별 성적 등록하는 화면 출력하기
  • html 5버전

삭제하기

StudentDAO.java : studentDelete

  • 매개변수 자리에 ? 를 작성한 뒤 값을 넣어준다.

MainController.java : main_delete

  • DAO에서 작성한 쿼리 문장을 실행 후, list.do로 화면을 이동시킨다.

5.0 버전으로 변경하기

AppConfig.java

  • DispatcherServlet => HandlerMapping (클래스 찾기) => ViewResolver (JSP찾기)
  • 5.0 버전(자바로만 코딩)하는 방식임
    • 기존에는 xml에 코딩했던 내용임

web.xml

@Configuration @EnableWebMvc @ComponentScan(basePackages={"com.haeni.*"}) configureDefaultServletHandling

  • 5.0 코딩
<init-parm>
	<param-name>contextClass</param-name>
	<param-value>org.springframework.web.context.support.AnnotationCofigWebApplicationContext</param-value>
</init-parm>
<init-parm>
	<param-name>contextConfigLocation</param-name>
	<param-value>com.haeni.config.AppConfig</param-value>
</init-parm>
  • 4.0 코딩
<init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/application-*.xml</param-value>
</init-param>

수정 전 내역 띄우기

PL/SQL

create or replace PROCEDURE studentDetailData(
    pNo NUMBER,
    pName OUT VARCHAR2,
    pKor OUT NUMBER,
    pEng OUT NUMBER,
    pMath OUT NUMBER
)
IS 
BEGIN
    SELECT name,kor,eng,math INTO pName,pKor,pEng,pMath
    FROM pl_student
    WHERE hakbun=pNo;
END;

StudentDAO.java : studentDetailData

  • registerOutParameter : out 변수에 값 채울때는 결과를 담을 메모리 공간을 먼저 만들고 값을 채워야함

MainController.java : main_update

  • studentDetailData에서 실행 후 받은 결과값을 JSP로 전송하기

update.jsp

  • 기존값이 value 로 들어가 있어야 함

list.jsp

  • 수정하기 버튼을 누르면 update.do?hakbun=${vo.hakbun } 이 요청되도록 하기

수정하기

PL/SQL

create or replace PROCEDURE studentUpdate(
    pNo NUMBER,
    pName VARCHAR2,
    pKor NUMBER,
    pEng NUMBER,
    pMath NUMBER
)
IS
    -- 변수 필요없음
BEGIN
    UPDATE pl_student SET
    name=pName,kor=pKor,eng=pEng,math=pMath
    WHERE hakbun=pNo;
    COMMIT;
END;

StudentDAO.java : studentUpdate

MainController.java : main_update_ok

  • 내용 수정 완료되면 list.do로 화면 전환하기