이클립스 Spring 지원이 끝났으므로 STS 다운해야 하는데
4는 부트용
3은 스프링용
VO는 DB에 있는 거 가져오는 느낌 =/= DAO
185p mapper가 관리
@Select 간단한 거 할 때
복잡한 거 할 때 XML 기법
Mapper XML
src/main/resource 내에 동일한 경로의
<!DOCTYPE mapper
매퍼임을 명시
resultType = CDATA sql /CDATA 에서 나온 걸 리턴해라
8.2 영속 영역(DB)의 CRUD 구현
실제로 구현을 가장 먼저 할 수 있는 영역도 영속 영역(프론트의 화면을 보고 DB의 테이블부터 작업하는 것... 콘솔까지만 하면 땡!!!)
MyBatis는 ? 대신 #{속성} 사용
BoardMapper.java
1. insert만 처리되고 생성된 PK값을 알 필요가 없는 경우 (DB에서 번호 생성 > nextval "1개의 게시물이 작성되었습니다")
public void insert(BoardVO board);
xml
<insert id="insert"> <!-- 1. 삽입 시 번호 생성, bno에 맞는 select문 필요 -->
insert into tbl_board (bno, title, content, writer) values (seq_board.nextval, #{title}, #{content}, #{writer})
</insert>
2. insert가 실행되고 생성된 PK값을 알아야 하는 경우 (번호가 생성되고 번호 이용하여 값 DB에 밀어넣음 > nextval에다 임의의 값 넣고 시작 "50번 게시물이 작성되었습니다")
Tip) 롯데리아에서 결제 완료 후 대기번호를 알려줄 때: 출력시 다시 sql로 부를 필요가 없다
public void insertSelectKey(BoardVO board);
인터페이스는 메서드를 직접 실행할 수 없어 추상 메서드라 부름
<insert id="insertSelectKey"> <!-- 2. 키 자동 생성 후 insert -->
<selectKey keyProperty="bno" order="BEFORE" resultType="long"> <!-- 이전에 long type으로 bno에 리턴 -->
select seq_board.nextval from dual <!-- dual: 가짜 테이블 -->
</selectKey>
insert into tbl_board (bno, title, content, writer) values (#{bno}, #{title}, #{content}, #{writer})
</insert>
JSP | HTML, CSS, JS | Service | Controller | Mapper | DB | |
역할 | View | Ajax, JSON | C R U D | C R U D | xml (MyBatis) | Table (Oracle) |
계층 | 프레젠테이션 영역 |
비즈니스 영역* | 영속성 영역 |
* Service(서비스): 비즈니스 영역에 있는 객체 (ex) 배송 정보, 상품 정보, 결제 정보 등이 합쳐진 상품 결제 페이지
비즈니스 영역
- 고객 요구 사항 반영, 사용자 정의 예외 처리
- 설계 시 계층 간의 연결은 인터페이스를 이용, 느슨한(loose) 연결로 한다
- 비즈니스(서비스) 인터페이스의 메서드명은 생활 용어로 짓는다
ex) register, get, remove, modify(생활용어) ↔ mapper: insert, select, delete, update (DB용어)
BoardServiceImpl.java
@Service //비즈니스 계층 명시
@Log4j
@AllArgsConstructor //모든 필드를 가지는 생성자, 의존성 처리
public class BoardServiceImpl implements BoardService {
private BoardMapper mapper; //의존
@Override
public void get(Long bno) {
log.info("get......" + bno);
return mapper.read(bno);
}
BoardController.java
@Controller
@Log4j
@RequestMapping("/board/*") //servlet.context.xml 설정 완료
@AllArgsConstructor
public class BoardController {
private BoardService service; //매퍼를 의존하는 보드 서비스(I)를 의존
@GetMapping("/list")
public void list(Model model) {
log.info("list");
model.addAttribute("list", service.getList()); //list(K)에 getList한 값 add
}
}
Tip) BoardController가 속한 org.zerock.controller 패키지는 servlet-context.xml에 설정<context:component-scan base-package="org.zerock.package" /> 되어 있다
생성자는 너 이거 안 쓰면 못 만든다는 제한으로 봐야..
대신에 RequiredArgsConstructor (자동 주입)
책 저자는 컨트롤러에 @Transactional 사용하기 추천
트랜잭션 == 거래
한 가지 일이 여러가지 작업으로 이루어짐
211P Form 인데 오타
Tip) 리턴 타입이 void면 매핑명으로 된 jsp파일을 찾는다
@Before //@Test(메서드별 테스트) 전에 먼저 할 것!
RedirectAttributes rttr 1회용으로 값 저장용
스프링은 세개만 기억하셍용 모델을 쓰던지, 객체를 쓰던지, FlashAttribute를 쓰던지
'Spring' 카테고리의 다른 글
Spring 06 - REST방식, 댓글 (0) | 2024.03.06 |
---|---|
Spring 05 - Paging (0) | 2024.03.04 |
기본적인 웹 게시물 관리 (0) | 2024.02.28 |
Spring 03 - Spring MVC, 파일 업로드(기본) (0) | 2024.02.28 |
Spring 02 - ConnPool (1) | 2024.02.27 |