일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- docker
- java
- 항해99
- 개인프로젝트
- 쇼트유알엘
- Kafka
- DB
- visualvm
- Spring Security
- JavaScript
- WEB SOCKET
- Spring
- emqx
- 데이터베이스
- AWS
- JWT
- 스웨거
- 스파르타코딩클럽
- EC2
- 생성자 주입
- 웹개발
- @jsonproperty
- MYSQL
- 프로그래머스
- 패스트캠퍼스
- 스프링의 정석
- CentOS
- 남궁성과 끝까지 간다
- 시큐리티
- 카프카
- Today
- Total
Nellie's Blog
[섹션5][미니프로젝트 소개 및 세팅] 40~45강 본문
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 |