개발 공부/Spring

영속/비즈니스 계층 DB CRUD

공부하는개발자_ 2023. 8. 24. 17:34

서블릿이 요청을 받아 비즈니스로직을 처리하고 DB에서 데이터를 가져오는 모든 작업을 할 수 있다.

이러한 구조는 하나로 묶어 스파게티용 코드라고도 한다.

 

서블릿: 비즈니스 로직

 

DAO를 뒤에 둬서 작업하는 구조를 따로 만든다 

 

MVC 구조

Spring core : 비즈니스 로직 담당

 

Controller : Mapping을 통해 일 처리를 하는 주최가 된다. 모든 처리를 다 하지 않고 들어와서 처리를 시켜 결과 받아서 전달해주는 역할에 집중

 

Service: 비즈니스 로직 처리

ServiceImpl: 인터페이스. 명령어들이 잔뜩 들어있는 명세서. abstract메서드만 가득 들어있다. 프로그래밍을 배운 상태여야 지원이 가능하다 이것이 강제 구현 명세서이다. 그래야 그 인터페이스에 맞는 클래스가 되어 지원을 할 수 있다. 인터페이스가 선언되어 있으면 메서드를 만들어 지원해주어야 한다. 일은 impl클래스가 한다. 일처리 후 컨트롤러에 넘겨줌.

 

Repository : DB를 컨트롤 하는 객체.

DAO : MyBatis를 사용하게 되면 직접적으로 구성할 일이 사라짐. Mapper를 이용하여 xml에서 query문 처리하게 됨.

VO,DTO : VO와 DTO가 용도가 다르다. 보통 많이 사용하는 것이 DTO인데 데이터를 전달하기 위해 만들어진 객체. DB에서 테이블 내용을 긁어 담아와 전달. VO는 DTO보다 제약이 조금 더 있다. 객체를 한번 만들면 바꾸지 못하는 것을 Immutable 이라고도 하는데, Immutable Class로 사용하는데, String 클래스가 예시이다. String클래스를 확장하여 다른 클래스를 만드는 것이 불가능하다. 객체를 만들면 고정되고, 객체 내용을 바꿀 수 없다. 새로 만들어야 한다. 매개변수의 개수가 많은 경우 편리성을 위해 만든 메서드를 사용하는 경우 VO를 사용하곤 한다. VO는 DB와 상관없이 편리성을 위해 묶어 덩어리로 사용하는 경우가 많다.  

 

프로젝트 패키지 구성

패키지 이름을 붙이는데도 규칙이 있다. 제1원칙은 url을 거꾸로 사용. url을 겹칠일이 없어서 패키지 이름으로 사용. 기본 패키지 노테이션은 미리 정해져있다. 컨트롤러 패키지에 클래스들을 모아 둠. 컨트롤러와 밀접한 연관이 있는 것이 서비스이다. 

 

zerock뒤에 context

context의 이름을 보통은 웹프로젝트의 이름을 쓰는 경우가 많음. 

 

 

내가 만들어야 할 bean이 무엇이 있는가?

context.xml에 필요한 내용들을 넣어줘야 함

DB와 접속을 하기위한 Configuration을 갖고있는 Bean필요

동작하기 위해서 sessionFactory필요

 

context.xml에 bean추가하는 작업

root-context.xml에 아래의 내용을 추가

Beans Graph를 확인하면 bean이 생성된 것을 확인 할 수 있다.

 

 

 

 

 

 

 

 

 

 

문법 지정 :

namespace를 이용한 스키마로 사용

mybtis를 체크해주고 soruce에서 추가해 줌

 

 

 

BoardMapperTest 클래스 : 스프링을 이용해서 BoardMapper인터페이스의 구현체를 주입받아 동작하게 함.

 

 

 

Mapper에 쿼리문 넣는것은 좋은 방식이 아님. xml파일에 따로 빼준다.

 

 

 

CRUD의 개발할 때 순서는 R C UD

 

 

내부적으로 시퀀스를 pk로 만들어서 쓰게 된다면 연계해서 쓰고자 하는 부분에서 

query를 사용할때 불편한 경우가 생기게 된다.

 

Oracle DB에서 테이블 생성

 

create sequence seq_board;

 

create table tbl_board (
  bno number(10,0),
  title varchar2(200) not null,
  content varchar2(2000) not null,
  writer varchar2(50) not null,
  regdate date default sysdate, 
  updatedate date default sysdate
);
 

alter table tbl_board add constraint pk_board 
primary key (bno);

 

 

insert into tbl_board (bno, title, content, writer)
values (seq_board.nextval, '테스트 제목', '테스트 내용', 'user00');

 

insert 쿼리문은 리턴이 없어서 void로 입력

 

p190

bno를 호출해서 내부적으로 ?로 바뀜 

id값을 read대신 selectbyPK로 주는 경우가 많음. 

 

id값: 메서드 이름과 일치하게 작성

resultType : select 쿼리의 결과를 특정 클래스의 객체로 만들기 위해 설정

CDATA: 순수한 문자열이 들어감을 의미. xml에서 부등호를 사용하기 위해 사용

MyBatis는 JDBC의 PreparedStatement를 활용하고 필요한 파라미터를 처리하는 '?'에 대한 치환은 #{속성}을 이용하여 처리.

 

create(insert)

insert( ) : 시퀀스 다음 값을 구해 insert 할 때 사용

insertSelectKey( ): @SelectKey라는 MyBatis의 어노테이션 이용. @SelectKey는 PK값을 미리 SQL을 통해 처리해두고 특정한 이름으로 결과를 보관하는 방식.

 

read(select)

insert가 된 데이터를 조회하는 작업은 PK를 이용해서 처리하므로 BoardMapper의 파라미터 역시 BoardVO 클래스의 bno (PK설정) 타입정보를 이용해서 처리함

 


delete

 

 

 

 

UPDATE

 

 

 

 

 

'개발 공부 > Spring' 카테고리의 다른 글

게시물 수정/ 삭제/ 모달  (0) 2023.08.28
비즈니스 계층 (Service) 설정  (0) 2023.08.25
pom.xml 수정 추가  (0) 2023.08.24
JDBC (Mapper) / Exception  (0) 2023.08.24
JDBC  (0) 2023.08.22