Spring

Spring 04

나주나주 2024. 2. 29. 09:52

이클립스 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