40. 미니프로젝트
게시판 4개, 게시판당 상위 5개 게시글 표시, 더보기, 로그인, 회원가입, 정보수정, 글쓰기, 첨부파일 업로드 등의 기능을 넣고 게시판을 작성해보자.
41. Spring MVC 프로젝트 구조
클라이언트 요청 발생
→ 서버는 요청정보 분석하여 컨트롤러로 전달
→ 필요한 작업을 해주는 서비스의 메소드로 전달
(만약 서비스의 메소드 중에서 데이터베이스와 관련된 코드가 있다면 DAO클래스를 만들어 호출시킴)
→ 컨트롤러는 서비스의 메소드가 전달해준 값을 받아서 브라우저로 전달
@Bean : 메서드를 통해 반환하는 객체를 Bean으로 등록합니다.
@Component : 개발자가 만든 클래스의 객체를 생성하여 Bean으로 등록합니다.
@Controller : Component의 일종으로 사용자 요청에 따라 자동으로 호출되는 메서드를 가지고 있는 Bean을 등록합니다.
@RestController : Component의 일종으로 사용자 요청에 따라 자동으로 호출되는 메서드를 가지고 있는 Beand을 등록합니다. Restful API 서버 구성 시 사용합니다
@ControllerAdvice : 예외가 발생했을 때 사용할 Global Exception Handler로 사용할 Bean을 등록합니다.
@Service : Controller에서 호출하는 메서드를 가지고 있는 Bean을 정의합니다. @Component로 정의한 Bean과 차이는 없습니다. @Controller처럼 기능이 부여되진 않지만 다른 개발자가 봤을 때 한눈에 볼 수 있도록 하기 위함
@Repository : @Service로 정의한 Bean에서 호출하는 메서드를 가지고 있는 Bean을 정의합니다. 이 Bean은 데이터베이스와 관련된 작업을 구현합니다. @Component로 정의한 Bean과 차이가 없습니다.
Spring MVC의 기본구조는 항상 아래와 같다.
42. 기본 구조 설정
선생님이 만들어두신 html을 따다가 복사해서 jsp를 만들었고,
상단메뉴, 하단메뉴는 따로 include라는 폴더에 저장한 후 import로 가져다쓰는 방식으로 만들었다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<c:import url="/WEB-INF/views/include/top_menu.jsp"/>
...
<c:import url="/WEB-INF/views/include/bottom_info.jsp"></c:import>
상대경로 설정으로 하면 오류가 생길 수 있기 때문에, 절대경로로 설정하였다.
<c:url var='root' value='/'/>
<a class="navbar-brand" href="${root }main">SoftCampus</a>
우측상단의 로그인/ 회원가입/ 정보수정/ 로그아웃 버튼을 누르면, 아래처럼 동작되도록 만들었다.
43. 나머지 링크 처리
Context Path를 jstl을 가지고 구하게되면, 링크 클릭시에 이렇게 세션id가 붙어서 링크이동이 잘 안될 경우가 있을 수 있다.
해결 방법은 jstl을 가지고 구하지 말고, jsp가 가지고 있는걸 가지고 와서 쓰면 된다.
<c:url var='root' value='/'/> //이거 말고
<c:set var='root' value="${pageContext.request.contextPath }/"/> //이거 쓰자!!!
그런데.. 나는 원래대로 <c:url var='root' value='/'/> 이렇게 써도 세션id가 붙지않았고,
오히려 <c:set var='root' value="${pageContext.request.contextPath }/"/> 이렇게 넣으니 500오류가 발생하였다..
이유는 모르겠으나 그냥 원래대로 <c:url var='root' value='/'/> 이렇게 넣어주고 진행하였다.
그 외에 버튼마다 링크 연결하기
44. 데이터베이스 테이블 만들기
선생님이 만들어두신 데이터 쿼리 메모장을 오라클 SQL Developer에 그대로 복붙하고 실행하면 테이블이 생성된다.
테이블의 컬럼명과 동일하게 bean클래스 생성 및 게터세터메소드 생성하기
45. MyBatis 설정
db.properties 파일 생성하기 & ServletAppContext파일에 추가하기
ServletAppContext 파일에 BasicDataSource, SqlSessionFactory, MapperFactoryBean도 작성하기
// Spring MVC 프로젝트에 관련된 설정을 하는 클래스
@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("kr.co.softcampus.controller")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer{
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
// 정적 파일의 경로를 매핑한다.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
// 데이터베이스 접속 정보를 관리하는 Bean
@Bean
public BasicDataSource dataSource() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName(db_classname);
source.setUrl(db_url);
source.setUsername(db_username);
source.setPassword(db_password);
return source;
}
// 쿼리문과 접속 정보를 관리하는 객체
@Bean
public SqlSessionFactory factory(BasicDataSource source) throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(source);
SqlSessionFactory factory = factoryBean.getObject();
return factory;
}
// 쿼리문 실행을 위한 객체(Mapper 관리)
@Bean
public MapperFactoryBean<BoardMapper> getBoardMapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<BoardMapper> factoryBean = new MapperFactoryBean<BoardMapper>(BoardMapper.class);
factoryBean.setSqlSessionFactory(factory);
return factoryBean;
}
}
출처 : [인프런] 윤재성의 만들면서 배우는 Spring MVC 5
'IT 강의 정리 > 윤재성의 스프링 MVC5' 카테고리의 다른 글
[섹션7][미니프로젝트-회원관리] 48~54강 (0) | 2022.11.10 |
---|---|
[섹션6][미니프로젝트-상단메뉴구성] 46~47강 (0) | 2022.11.08 |
[섹션4][Spring MVC 인터셉터와 MyBatis] 34~39강 (0) | 2022.10.26 |
[섹션3][Spring MVC의 유효성 검사] 27~33강 (0) | 2022.10.25 |
[섹션2][Spring MVC에서의 Bean관리] 20~26강 (0) | 2022.10.24 |