Backend/Spring

Spring 기본 routine : logic & setting

쏠솔랄라 2023. 5. 17. 17:21

 

 

dao JAVA package 생성

 

 

: interface로 BoardDAO 생성

 

 

package dao;

import java.util.List;

public interface BoardDAO {

// CRUD의 기능을 정의

int insert(Object ob); // create
List<String> selectList(); // Read
int update(Object ob); // Update
int delete(int idx); // delete

}

 

 

: BoardDAOImpl

 

 

package dao;

import java.util.ArrayList;
import java.util.List;

public class BoardDAOImpl implements BoardDAO {

@Override
public int insert(Object ob) {
return 0;
}

@Override
public List<String> selectList() {

List<String> list = new ArrayList<String>();

list.add("감");
list.add("배");
list.add("오렌지");
list.add("용과");

return null;
}

@Override
public int update(Object ob) {
return 0;
}

@Override
public int delete(int idx) {
return 0;
}

}


스프링 컨텐츠 객체 생성

 

 

: root-context.xml에서 스프링 컨텐츠의 객체 생성

 

 

<bean id="boardDAO" class="dao.BoardDAOImpl" />

<!-- 스프링 컨텐츠의 객체를 만든 것 -->

<bean id="boardService" class="service.BoardServiceImpl">
<constructor-arg ref="boardDAO" />
</bean>

 

 

BoardController 생성

 

 

: controller 패키지 > BoardController 자바클래스 생성

 

 

:  BoardController가 Controller라는 것을 인식시킴

 

 

/*
@Component : Repository, Service, Controller의 부모 클래스
용도에 맞게 Component보다는 용도에 맞는 클래스를 적는 것을 권장

@Repository
@Service
@Controller
 */

@Controller // 해당 클래스가 Controller라는 것을 인식시킨다

public class BoardController {

public BoardController() {
System.out.println("--- BoardController() ---");
}

}

 

 

service 패키지 생성

 

view > controller > Action > DAO
view > controller > Service > DAO

jsp에서는 url을 컨트롤러 단위로 관리
spring에서는 method 마다 url을 지정해 관리

* DAO는 하나의 테이블을 관리
* Service는 DAO들을 관리

 

 

: service패키지에 BoardService를 인터페이스로 생성

 

 

package service;

import java.util.List;

public interface BoardService {

int insert(Object ob); // create
List<String> selectList(); // Read
int update(Object ob); // Update
int delete(int idx); // delete

}

 

 

: 오버라이딩 생성자 생성

 

 

package service;

import java.util.List;

import dao.BoardDAO;

public class BoardServiceImpl implements BoardService {

private BoardDAO boardDAO;

public BoardServiceImpl (BoardDAO boardDAO) {
this.boardDAO = boardDAO;
}

@Override
public int insert(Object ob) {
return 0;
}

@Override
public List<String> selectList() {
return null;
}

@Override
public int update(Object ob) {
return 0;
}

@Override
public int delete(int idx) {
return 0;
}

}

 

 

setter 인젝션

 

 

: BoardController에 세터 인젝션 지정

 


public void setBoardService(BoardService boardService) {
this.boardService = boardService;
}

 

 

: servlet-context.xml에서 setter로 컨트롤러 수동 생성

 

 

<beans:bean id="boardController" class="controller.BoardController"> <!-- setter로 수동 생성한 컨트롤러 -->
<beans:property name="boardService" ref="boardService" />
</beans:bean>

 

 

이 경우 서버 오류를 발생시키게 되는데

자동생성과 수동생성이 동시에 발생해 생기는 오류이므로

자동생성부분을 삭제해 주면 된다

 

 

: auto 생성 컨트롤러의 수동컨트롤러 부분 삭제

 

 

<!-- <context:component-scan base-package="com.increpas.di, contorller" /> -->

<!-- Auto 생성 컨트롤러 -->

<!-- 
auto-detecting
: servlet-context를 통해서 component들을 자동으로 생성해주는 기능
읽어들일 패키지를 적으면 자동으로 읽어들인다
인젝션을 사용할 수 없는 상태 ; 인젝션을 써야 하는 경우 수동생성을 해 준다

자동생성과 수동생성을 동시에 하게 되면 url 맵핑이 겹치므로 에러가 발생한다
-->

<context:component-scan base-package="com.increpas.di" /> 

<!-- 따라서 오토생성컨트롤러에서 수동생성컨트롤러 부분을 삭제 -->

 

 

데이터를 Service에서 바로 넘기기 위한 세팅

 

 

: Service 패키지의 BoardServiceImpl에서 return값 수정

 

 

@Override
public int insert(Object ob) {
return boardDAO.insert(ob);
}

@Override
public List<String> selectList() {
return boardDAO.selectList();
}

@Override
public int update(Object ob) {
return boardDAO.update(ob);
}

@Override
public int delete(int idx) {
return boardDAO.delete(idx);
}

 

 

: BoardController에서 list로 데이터를 가지고 바로 이동시키기 위해 RequestMapping 진행

 

 

@RequestMapping("/board/list")
// Spring에서는 Method마다 url Mapping을 한다
// @RequestMapping("URL")
public String list() {
// String 반환 : 넘어갈 페이지의 정보인 view 정보를 반환하겠다는 뜻

return "list"; // /WEB-INF/views/list.jsp로 전달된다 // forward방식으로 포워드 방식으로 넘어간다

 

 

controller 에 로직 추가

 

 

데이터를 가지고 이동하기 위해 로직 추가

 

: controller > BoardController에 넘어갈 페이지의 정보를 로직으로 구현

 

 

@RequestMapping("/board/list")
public String list(HttpServletRequest request) {

List<String> list = boardService.selectList();
request.setAttribute("list", list);

return "list"; 

 

 

그런데, 단순히 값만 넘겨야 할 때는 model 방식을 더 많이 사용한다

 

Model

: 인터페이스
Servlet과 Controller의 중간 매개체 역할
단순히 데이터를 주고받기 위한 객체
request영역과 binding 처리가 되어 있다
model에 Attribute를 저장하면 request영역에 저장하게 된다

request.setAttribute()와 같은 역할

 

 

@RequestMapping("/board/list")
public String list(Model model) {

List<String> list = boardService.selectList();
model.addAttribute("list", list);

return "list";

 

 

출력페이지 구현(뷰페이지)

 

 

: list에서 뷰페이지 구현

 

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 추가

 

<h3>List Page</h3>

<ol>
<c:forEach var="f" items="${requestScope.list} ">
<li>${f }</li>
</c:forEach>
</ol>