오늘부터 MVC 스프링으로 웹 개발 진행
src > main > webapp > WEB-INF > views : .jsp 파일들이 들어가는 곳
pom.xml : jar 파일들을 추가하여 maven 에서 자동으로 다운로드 할 수 있게 함
* @Controller : 컨트롤러
* @Service : 서비스
* @Repository : DAO
* @Component : 그 외 객체로 만듬
기존에 있던 homeController 는 삭제하고 새로 IndexController 를 생성
@Controller
public class IndexController {
// @RequestMapping(value="/", method = RequestMethod.POST)
// @RequestMapping(value="/") // GET, POST 둘 다 입력
// @RequestMapping("/") // value="/" 를 더 축약한 버전
@RequestMapping(value="/", method = RequestMethod.GET)
public String home() {
return "index";
}
웹에 "/" 접속 요청이 들어오면 index.jsp 를 열어줌
servelt-controller.xml 안의
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
스프링에서 자동으로 /WEB-INF/views 에 return 한 String 값을 받아 .jsp 를 붙임
views 안에 있는 .jsp 파일을 열어줌
이 상태로 스프링을 실행할 경우 404 오류를 반환
현재 배우는 과정은 스프링
이후 스프링 부트도 진행
스프링 = .jsp 를 사용하여 진행
스프링부트 = jsp, 타임리프
POJO : Plain Old Java Object, 스프링 책 p.50
DI : Dependency Injection, 의존성 주입
DI 는 필요한 객체를 찾아서 필요하다는 신호를 보낸 곳으로 해당 객체를 보내줌
서로의 의존성을 낮추고 직접 객체를 생성하지 않아도 객체를 사용할 수 있음
그런 관리를 Bean(빈) 이라고 부르고 빈과 빈을 처리하는 방식으로 개발을 진행
DI 테스트 해보기
package org.solbum.human;
// DI 테스트
// 기존 DTO 처럼 생성이 됨
public class Human {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Controller 에서 기존에 사용하던 방식
@GetMapping("/")
public String home() {
// 기존에 진행하던 방식
Human human = new Human();
human.setAge(30);
human.setName("sb");
System.out.println(human.getAge());
System.out.println(human.getName());
return "index";
}
<!-- root-context.xml 여기서 객체를 생성함 -->
<!-- class : 객체를 만들 클래스, 뒤에 패키지를 포함한 전체 이름 작성 -->
<!-- id : 해당 객체를 어떤 이름으로 할 지 설정 -->
<bean class="org.solbum.human.Human" id="human">
<!-- 객체를 만들 때의 값 설정 -->
<!-- name : 해당 객체의 값 이름 -->
<!-- value : 해당 객체의 name 의 값 -->
<property name="age" value="30"></property>
<property name="name" value="sb"></property>
</bean>
다시 Controller 를 들어가서
@Inject 어노테이션을 사용
// 의존성 주입
// @AutoWired = 스프링 제공, 객체의 타입으로 검사
// @Qualifier("")
// @Inject = 자바 제공, 객체의 타입이 일치하면 자동 주입
// @named("")
// @Resource = 자바 제공, id 가 일치하는 것에 주입
// @Resource(name="")
@Inject
private Human human;
@GetMapping("/")
public String home() {
// 기존에 진행하던 방식
// Human human = new Human();
// human.setAge(30);
// human.setName("sb");
System.out.println(human.getAge());
System.out.println(human.getName());
return "index";
}
index 페이지를 로드 시
이제 Getter, Setter 를 직접 설정하는 것 보다
lombok (롬복) 을 이용하여 어노테이션으로 진행
@Getter
@Setter
public class Human {
private int age;
private String name;
}
@Getter
@Setter
@Data
Getter, Setter 는 get, set 만 만들어주지만
Data 는 다른 문법들도 만들어줌
src/main/resources 밑에 spring 이라는 패키지를 만듦
패키지 안에
new -> spring bean configuration file 생성
db 접속 정보를 기록할 파일 생성 -> 안에 bean 생성
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- DB 접속 정보 -->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="username" value="--"></property>
<property name="password" value="--"></property>
<property name="url" value="----"></property>
<property name="driverClassName" value="org.maraidb.jdbc.Driver"></property>
</bean>
<!-- name = dataSource 인 Property 는 객체를 포함하고 있기 때문에 ref 로 값을 받음 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:/mybatis/mappers/*-Mapper.xml"></property>
<property name="configLocation" value="classpath:/mybatis/config/mybatis-Config.xml"></property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
</bean>
</beans>
resources > mybatis > config > mybatis-Config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- 우리가 만든 파일의 경로를 작성하여 별칭을 정해야 자바에서 확실하게 알 수 있음 -->
<typeAlias type="java.lang.Integer" alias="integer"/>
<typeAlias type="java.util.HashMap" alias="map"/>
</typeAliases>
</configuration>
위에 적힌 것은 예시일 뿐임
mybatis > mappers > board-Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="board">
<select id="boardList">
select * from board
</select>
</mapper>
// 결합도는 낮을수록 좋음
// 응집도는 높을수록 좋음
// Controller -> Service -> Repository -> Mybatis -> DB
// Repository : DAO 생성, DB : mariadb 연결
// MVC : Model, View, Controller
// Model : 데이터, 데이터의 값, DAO, DTO, Mybatis, DB
// View : Model 값을 붙여 사용자에게 보여지는 화면, .jsp 파일
// Controller : 흐름 제어, 사용자 요청이 들어오면 먼저 동작
/board 입력이 들어오면 board 로 넘어갈 수 있게 파일 생성하기
// 게시판 관련 기능 넣기
@Controller
public class BoardController {
@PostMapping("/board")
public String board() {
return "board";
}
}
board.jsp 파일 생성하여 실행해보기
@PostMapping 으로 어노테이션을 생성할 경우
해당하는 오류가 발생함
@GetMapping 으로 진행해야 해당 오류가 발생하지 않음
// 게시판 관련 기능 넣기
@Controller
public class BoardController {
@GetMapping("/board")
public String board() {
return "board"; // jsp 파일 이름
}
}
로 만들어야 정상 작동
Controller 는 생성하여 Service 를 생성
패키지를 service 를 따로 만들고, BoardService 생성
Service : Controller 의 요청에 맞추어 Repository 에서 받은 정보를 가공하여 Controller 로 넘겨주는 비지니스 로직
BoardList 를 출력하는 페이지 만들어보기
BoardController 에 BoardService 연결하기
// 서비스와 연결하기
@Autowired
private BoardService boardService;
기존 BoardList 를 받아오는 것 만들기
// Service 에게 일 시키기
List<BoardDTO> list = boardService.boardList();
List 에 들어갈 값 타입이 BoardDTO 이기 때문에 BoardDTO 생성
@Getter
@Setter
public class BoardDTO {
private int board_no, board_count, comment;
private String board_title, mname, board_date;
}
lombok 을 사용하여 getter, setter 생성은 어노테이션으로 대체
outline 으로 get, set 잘 생성되었는지 체크
boardList() 메소드를 service 에 생성
public List<BoardDTO> boardList() {
System.out.println("서비스예요");
return null;
}
먼저 잘 연결되었는지 체크하기
boardList 메소드에서 값을 받아올 수 있게 DAO 생성
@Repository
public class BoardDAO {
}
@Repository 어노테이션을 통해 서버 실행 시 등록됨
BoardService 에 Controller 와 같이 @Autowired 를 통해 객체 생성하기
@Autowired
private BoardDAO boardDAO;
BoardService 에서 또 BoardDAO 에 일을 시킴
public List<BoardDTO> boardList() {
System.out.println("서비스예요");
List<BoardDTO> list = boardDAO.boardList();
return list;
// return boardDAO.boardList(); 와 동일
}
직접 글을 작성하여 리스트에 넣기
public List<BoardDTO> boardList() {
System.out.println("DAO예요");
List<BoardDTO> list = new ArrayList<BoardDTO>();
BoardDTO dto = new BoardDTO();
dto.setBoard_no(1);
dto.setBoard_title("제목");
dto.setMname("작성자");
dto.setBoard_date("2024-02-13");
dto.setBoard_count(10);
dto.setComment(2);
list.add(dto);
return list;
}
BoardController 에 파라미터 입력값으로 Model 을 받음
@GetMapping("/board")
public String board(Model model) {
// Service 에게 일 시키기
List<BoardDTO> list = boardService.boardList();
// 세팅하기
model.addAttribute("list", list);
return "board"; // jsp 파일 이름
}
board.jsp 에는 테이블을 만들어서 출력
확인됐으면 DAO 에 아까 board-mapper.xml 에 설정한 mybatis 에 일 시키기
public List<BoardDTO> boardList() {
System.out.println("DAO예요");
return sqlSession.selectList("board.boardList"); // namespace.id
}
여기까지 진행하면 오류 발생
mybatis-Config.xml 에 typealias 설정을 진행해야 함
<configuration>
<typeAliases>
<!-- 우리가 만든 파일의 경로를 작성하여 별칭을 정해야 자바에서 확실하게 알 수 있음 -->
<typeAlias type="org.solbum.dto.BoardDTO" alias="boardDTO"/>
</typeAliases>
</configuration>
board-Mapper.xml 에 결과값 타입도 설정해줘야 함
<mapper namespace="board">
<select id="boardList" resultType="boardDTO">
select board_no, board_title, mname, board_date, board_count, comment
from boardview limit 0, 10
</select>
</mapper>
하면 정상적으로 출력되는 것을 볼 수 있음
mybatis 에서 resultType 과 parameterType 의 차이점을 검색해봄
'Spring' 카테고리의 다른 글
240220 스프링 프로젝트 (0) | 2024.02.20 |
---|---|
240219 스프링 프로젝트 (0) | 2024.02.19 |
240216 스프링 프로젝트 (2) | 2024.02.16 |
240215 스프링 프로젝트 (0) | 2024.02.15 |
240214 스프링 프로젝트 (1) | 2024.02.14 |