IT 강의 정리/윤재성의 스프링 MVC5

[섹션5][미니프로젝트 소개 및 세팅] 40~45강

Nellie Kim 2022. 11. 6. 16:39
728x90

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