Programming/스프링(spring) - Enterprise

스프링(spring)/ 게시판 구축 1(메인 페이지)

esoog Polaris 2023. 7. 19. 21:38
반응형

# 앞의 Spring 5, 7, 8번까지(설치와 기본설정 관련) 완료 후에 진행해야 함.

미리 사용할 데이터베이스에 샘플 자료 20개 정도 넣어놓고 실습.

 

 

 

 

 

1. 페이지 구현을 위해 views에 board폴더 생성 후,

list.jsp파일 생성으로 목록 페이지 만들기.

그리고 아래 코드를 추가한다.(커스텀)

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>

<body>

    <table>
        <thead>
            <tr>
                <th>번호</th>
                <th>제목</th>
                <th>작성일</th>
            </tr>
        </thead>

        <tbody>

        </tbody>

    </table>

</body>

</html>

 

 

 

 

 

2. jsp(v 뷰 관련)파일은 단순 실행되지 않는다. 그럼? controller(c 컨트롤 관련) 자바 파일로 경로를 잡아줘야 한다.

src/main/java 폴더 내 기본 HomeController가 있는 패키지에, BoardController 클래스를 생성한다.

그리고 아래 코드를 추가한다.(빨갛게 지금은 에러 떠도 된다. 추가할거니까.)

 

package com.project.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.project.model.BoardDAO;
import com.project.model.BoardVO;
import com.project.service.BoardService;
// ~.~.~.Board 이전의 것들은 패키지로, 본인의 생성 패키지에 맞추어 넣는다.
// 귀찮으면 똑같이 만들어도 된다. 데이터처리 관련 Model을 구현할 패키지를 사용하기 위해서. 

@Controller
// mvc에서 컨트롤러 역할 어노테이션
@RequestMapping("/board/*")
public class BoardController {
 @RequestMapping(value = "/list", method = RequestMethod.GET)
// 어노테이션 @RequestMapping("/경로파일이름", method = RequestMethod.GET)
// 요청을 경로 파일로 매핑 시켜준다. 방식은 GET. 위에서 클래스 매핑으로 /board/*가 앞서 되어 있다. 함수들은 *이후url
// 어노테이션 자체가 .jsp파일명 없이 매핑시켜준다. 멋있다. 

 public void getList() throws Exception {
 }
}

 

 

 

 

 

3. 그럼 내용은? Controller에 연결시켜서 동작할 데이터 처리 과정(m 모델 관련)을 만들어 줘야 한다.

먼저, 위에서 import사용 하려는 파일부터 생성한다.

src/main/java에 위에서 (이름지었던)사용할 패키지를 만든다.

그 안에 게시판에 쓸 BoardVO 자바 파일 만든다.

그리고 그 안에는 데이터 테이블에서 사용할 컬럼과 타입을 똑같이 만들어 준다.

클래스 안에 코드를 추가 한다.(데이터는 커스텀)

* 패키지를 생성 후, 스프링에서 사용하려면, root-context.xml 파일에 컴포넌트로 입력을 시켜줘야 한다.

<context:component-scan base-package="com.project.model" />

 

package com.project.model;

import java.util.Date;

public class BoardVO {
	
	private int idx;
	private String title;
	private String text;
	private String nick;
	private Date date;
	private int hcount;
	
	public int getIdx() {
		return idx;
	}
	public void setIdx(int idx) {
		this.idx = idx;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public String getNick() {
		return nick;
	}
	public void setNick(String nick) {
		this.nick = nick;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public int getHcount() {
		return hcount;
	}
	public void setHcount(int hcount) {
		this.hcount = hcount;
	}
	
}

*getter setter는 스프링 - 메뉴 source - Generate 게터와 세터 - 모두 선택해서 만들어준다.

Date 타입이 바로 안잡히는데; ctr + shift + O 를 눌러서, java.util.Date 추가하면 된다.

 

 

 

 

4. 그리고, 만들어진 VO객체를 Mybatis로 사용하려면, mapper에서 데이터베이스 쿼리문으로 처리해주면 된다.

src/main/resources/mappers폴더 사용할 매퍼(이전의 mysql 설정시, 만들었던 boardMapper.xml을 사용했다.) 아래 코드를 추가 한다 .

 

<!-- 게시물 목록 메인 페이지-->
<select id="list" resultType="com.project.model.BoardVO">
 select
  idx, title, text, nick, date, hcount
 from board
</select>

* (resultType="com.project.model.BoardVO"은 데이터를 리턴받을 객체 클래스다.)

* resultType 은 데이터를 받을 때(select 등), parameterType 은 데이터를 보낼 때(insert, update, delete 등) 사용한다.

 

 

 

 

5. 여기서 VO는 단순히 데이터를 담는 객체로서의 역할 뿐이다. 그래서 DAO, 데이터베이스와 상호작용하는 객체가 필요.그런데 왜 둘로 나뉘어 사용하나? 결론은 객체로서 유지보수성과 확장 사용을 위해 단일 책임원칙을 지키는 것. Mybatis? 이 친구는 Mysql과 자바클래스 사이에서 데이터베이스 처리를 더 용이하게 해주는 프레임 워크!

 

이제 VO가 있는 패키지에, BoardDAO를 만드는 데; 이것은 인터페이스다. 구현하는 객체를 필요로 한다.

우선 BoardDAO에 아래 코드를 추가한다.

 

package com.project.model;

import java.util.List;
import com.project.model.BoardVO;

public interface BoardDAO {
 public List<BoardVO> list() throws Exception; 

}

 

 

그리고 인터페이스니까 구현 클래스, BoardDAOImpl 클래스를 만들어준다.

*클래스 생성시, 창 가운데 인터페이스 Add버튼 누르고 인터페이스 검색해서 구현 쉽게 가능.

그리고 아래 코드 추가.

 

package com.project.model;

import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository
// DAO구현 어노테이션이다.
public class BoardDAOImpl implements BoardDAO {
 @Inject
 private SqlSession sql;
 private static String namespace = "com.project.mappers.board";

 // 게시물 목록
 public List<BoardVO> list() throws Exception{ 
  return sql.selectList(namespace + ".list");
 }
}

* DAOImpl을 보면, @Inject어노테이션으로 SqlSession을 주입받는데; 이게 Mybatis와 상호작용하는 부분이다.

list 아이디를 가진 쿼리를 실행하여, BoardVO 타입의 리스트 형식으로 반환.

 

 

 

 

 

6. M(모델) - V(JSP) - C(컨트롤러)인건 대충 알겠는데, jsp파일에 기어코 남아있는 import com.project.service.BoardService; 저녀석은 뭐지?

 

스프링에서 비즈니스 컴포넌트인 서비스(Service)는 주로 비즈니스 로직을 구현하고 제공하는 역할. 서비스는 컨트롤러(Controller)와 데이터 액세스 계층(DAO, Repository) 사이에서 중간 계층으로 동작하여 비즈니스 로직의 흐름을 제어하고 처리. 그러니까 DAO의 직접적인 사용을 배제해서 유지보수성를 높이고, 다형성의 장점을 활용하기 위함.

서비스는 주로 다음과 같은 기능을 수행:

1. 비즈니스 로직 구현: 서비스는 비즈니스 도메인의 특정 요구사항과 규칙을 구현합니다. 예를 들어, 주문 처리, 결제 로직, 회원 가입 등과 같은 비즈니스 도메인에 해당하는 작업을 수행

2. 트랜잭션 관리: 서비스는 트랜잭션의 범위를 정의하고 관리. 여러 개의 데이터 액세스 계층 메서드를 호출하거나 여러 개의 데이터베이스 작업을 묶어 하나의 트랜잭션으로 처리할 수 있도록 도와줍. 이를 통해 데이터 일관성과 안전한 데이터 조작을 보장할 수 있습.

3. 다른 컴포넌트와의 협업: 서비스는 컨트롤러(Controller)와 데이터 액세스 계층(DAO, Repository) 사이에서 데이터 및 작업 흐름을 조율하고, 다른 컴포넌트와의 협업을 위한 인터페이스 역할을 수행. 서비스는 컨트롤러로부터 전달받은 요청을 처리하고, 필요에 따라 데이터 액세스 계층을 호출하여 데이터를 저장하거나 조회하는 등의 작업을 수행.

서비스는 스프링의 의존성 주입(Dependency Injection)과 함께 사용되어 객체 간의 결합도를 낮추고 테스트 용이성을 높일 수 있습. 스프링은 서비스 빈(Service Bean)을 생성하고 관리하는 기능을 제공하여 개발자가 비즈니스 로직을 구현한 서비스 객체를 쉽게 사용할 수 있도록 합.

 

결론은, 우리는 모두 비즈니스를 위한 스프링을 사용한다는 사실. 그러므로 비즈니스 로직을 구현해야 한다는 것.

그래서 Service 컴포넌트를 사용한다는 것.

 

 

 

 

7. 자, 그럼 src/main/java에 com.project.service 패키지를  생성(DAO와 Imple관계처럼)

BoardService 인터페이스(BoardDAO 역할)를 먼저 만들고, 아래 코드 추가.

 

package com.project.service;

import java.util.List;
import com.project.model.BoardVO;

public interface BoardService {
public List<BoardVO> list() throws Exception; 
}

 

 

BoardServiceImpl 클래스(BoardDAOImpl) 역할을 만들고, 아래 코드 추가.

 

package com.project.service;

import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.project.model.BoardDAO;
import com.project.model.BoardVO;

@Service
public class BoardServiceImpl implements BoardService {
 @Inject
 private BoardDAO dao;
 @Override
 public List<BoardVO> list() throws Exception {
  return dao.list();
 }
 
}

* BoardDAOImpl과 비교해보면, 기존 DAO를 주입시켜 쿼리문의 상호작용 없이, 리스트 객체만 받아온다.

* 패키지를 생성 후, 스프링에서 사용하려면, root-context.xml 파일에 컴포넌트로 입력을 시켜줘야 한다.<context:component-scan base-package="com.project.service" />

 

 

 

 

8. 이제 Controller에서 리스트로 보낼 데이터 로직을 추가.

BoardController에 아래 코드로 추가 수정.

 

package com.project.controller;

import java.util.List;
import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.project.model.BoardDAO;
import com.project.model.BoardVO;
import com.project.service.BoardService;

@Controller
@RequestMapping("/board/*")
public class BoardController {

 @Inject
 private BoardService service;

 @RequestMapping(value = "/list", method = RequestMethod.GET)
 public void getList(Model model) throws Exception {
  
  List<BoardVO> list = null;
  list = service.list();
  model.addAttribute("list", list);
 }
}

* 서비스를 주입시켜 로직을 완성했다. list 선언과 초기화 후, model.addAttribute("list", list);

의 의미는 모델(model)객체에 .addAttribute("list", list); 데이터를 추가한다("list"라는 이름으로, list변수를)

 

 

 

 

9. 드디어 모델 객체를 받아서 JSP에서 사용할 수 있다.

아까 생성한, list.jsp파일(tbody 안)에 아래 코드를 추가한다.

<tbody>

<c:forEach items="${list}" var="list">
 <tr>
  <td>${list.idx}</td>
  <td>${list.title}</td>
  <td>${list.text}</td>
  <td>${list.nick}</td>
  <td><fmt:formatDate value="${list.date}" pattern="yyyy-MM-dd HH:mm:ss" /></td>
 </tr>
</c:forEach>

 </tbody>

* jstl forEach 문 사용은 보면서 알아가면 된다.

${list}가 모델 객체 'list'를 사용하는 방법이다.

날짜는 보기 좋은 형식으로 바꾸기 위해 JSTL 함수 참고.

함수 사용 위해, 상단에 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 라이브러리 추가

 

 

 

 

10. 메인 홈페이지에서 a링크 태그 삽입 후 실행 확인.

home.html에서  body태그 안에 아래 코드 추가

 

<a href="/board/list">게시물 목록 메인 페이지</a>

확인. 나이스.

728x90