-제목-
코드로 배우는 스프링 웹 프로젝트

-부제-
현업 개발을 위한 단계별 실습서

저자: 구멍가게 코딩단
출판사: 남가람북스
발행일: 2015-08-16
ISBN: 979-11-954845-2-2
가격: 32,000원
페이지: 744
판형: 182*232*356
바코드: 9 791195 484522 93000

-저자 소개-
지은이: 구멍가게 코딩단
프로그래밍을 좋아하지만, 남들 앞에 나설 용기 없는 10년 차 이상 개발자, 현업 관리자, 강사들의 비공개 모임. 유일한 공통점은 집필 담당인 강요천의 지인이라는 점.
어린 시절 구멍가게 앞 아저씨들이 인생의 진리를 가볍게 던졌던 것처럼 프로그래밍의 오의(奧義)를 가볍게 던지고 싶은 사람들의 모임.
http://zerockcode.blogspot.kr를 통해서 세상과 소통을 시작하고 있고, 조만간 동영상 강의, 오프라인 교육 등의 계획을 발표할 예정임.


-책소개-
이 책의 주제는 Spring Framework(이하 스프링)를 이용해서 말 그대로 ‘웹 프로젝트’를 어떻게 진행하는지를 설명하는 책입니다. 웹 프로젝트라고 거창하게 표현을 하지만 좀 더 구체적으로는 스프링으로 웹 프로젝트에서 사용되는 게시물 관리를 만들어 보는 것이 주된 목적입니다.

모든 웹 프로젝트는 그 성격에 따라 구성과 구조가 다르긴 하지만 결과적으로는 게시물 관리 모듈의 집합체라고 볼 수 있습니다. 이 책에서는 웹 프로젝트에 사용되는 게시물을 다음과 같은 예제들로 작성합니다.
* 단순한 등록, 수정, 삭제, 조회, 페이징 처리가 필요한 게시물 관리
* Ajax를 이용해서 동작할 필요가 있는 게시물 관리
* 자료실과 같이 첨부파일 기능이 필요한 게시물 관리
* 모바일에서 사용할 수 있는 REST 기반의 게시물 관리
* 보안처리가 필요한 게시물 관리

-출판사 리뷰-
현재까지 출간된 스프링관련 많은 서적들은 주로 스프링의 내부 구조나 원리 등 이론적인 배경에 초점을 두었지만, 이 책은 그보다는 개발 현장에서 사용하는 도구로서 스프링을 취급합니다.

<이 책의 대상 독자>
이 책은 웹 프로젝트를 진행하는 과정에서 스프링을 사용하기 때문에 다음과 같은 선수지식이 필요합니다.
* Java 언어에 대한 기본 지식
* Servlet/JSP의 실습 경험 및 기본 지식
* HTML/JavaScript/CSS에 대한 기본 지식

이 책은 다음과 같은 개발자를 대상으로 합니다.
* 프레임워크를 사용해서 개발 경험을 쌓으려는 개발자
* 웹 개발 지식과 경험은 있지만, 스프링을 사용해 본 적이 없는 개발자
* 최근에 변화된 스프링을 이용해서 개발하고 싶은 개발자
* 웹 프로젝트를 진행하면서 어떤 개발 단계를 거쳐야 하는지 알려는 개발자

<이 책의 구성과 활용방법>

이 책의 구성은 크게 다음과 같습니다.
#. Part 1: 프로젝트의 기본 구조 구성
     스프링의 몇 가지 특징
 스프링 MVC, MyBatis 개발 환경 설정
 개발에 사용하는 MySQL 데이터베이스의 설정과 테스트

#. Part 2: 기본적인 기능의 게시물 관리
 단순한 등록, 수정, 삭제, 조회와 리스트 기능의 게시판 만들기
 페이징 처리와 검색기능

#. Part 3: Ajax 댓글 처리
 REST 방식의 개발과 @RestController
 jQuery와 Ajax를 이용하는 서버 호출
 Ajax와 REST 방식을 이용하는 게시물에 대한 댓글 처리

#. Part 4: AOP와 트랜잭션 처리
 AOP의 개념과 설정
 트랜잭션 관리의 설정과 테스트 

#. Part 5: 게시물의 첨부파일 기능 
 <form>을 이용하는 파일 업로드
 Ajax를 이용하는 파일 업로드
 썸네일 이미지 처리와 다운로드

#. Part 6: 인터셉터를 활용하는 로그인 처리
 인터셉터와 필터
 로그인 처리와 로그인 체크
 세션 방식으로 로그인 처리
 자동로그인 처리


-목차-

들어가며

PART 1 프로젝트의 기본 구조 구성

1. 개발 환경의 설정
1.1 STS의 설치와 개발환경
1.2 스프링 프로젝트를 시작하는 두 가지 방법
1.3 Spring Project를 이용한 프로젝트 생성
1.4 라이브러리의 초기화
1.4.1 프로젝트의 실행 점검
1.4.2 JDK 버전의 처리
1.4.3 스프링 MVC 프로젝트 템플릿의 구조
1.4.4 Spring 프레임워크의 버전 변경
1.4.5 Tomcat 8 설치 및 사용
1.4.6 설치 작업 정리

2. 스프링에 대한 간단 소개
2.1 스프링 프레임워크가 개발의 대세가 된 이유
2.2 스프링의 주요 특징
2.2.1 POJO 기반의 구성
2.2.2 의존성 주입(DI)을 통한 객체 간의 관계 구성
2.2.3 AOP의 지원
2.2.4 트랜잭션의 지원

3. 예제를 위한 MySQL의 설정과 스프링 테스트
3.1 MySQL의 설치
3.2 MySQL Workbench의 활용
3.2.1 계정 연결
3.2.2 MySQL의 새로운 스키마 추가
3.2.3 사용자의 기본 스키마 설정
3.2.4 DB 테스트
3.3 MySQL 연결 테스트와 jUnit
3.3.1 MySQL 테스트 관련 라이브러리
3.3.2 JDK 1.7이상의 JDBC 코딩
3.4 작업 내역의 정리
 
4. 스프링 + MyBatis + MySQL의 설정
4.1 일반적인 스프링 웹 프로젝트의 구성
4.1.1 이 책의 프로젝트 구성
4.2 MyBatis와의 구성
4.3 MyBatis 연동을 위한 준비
4.3.1 spring-jdbc, spring-test, MyBatis, mybatis-spring 추가
4.3.2 Spring Project에서 root-context.xml 파일의 수정
4.4 MySQL과의 연결을 담당하는 DataSource 설정하기
4.4.1 DataSource의 테스트 진행
4.5 MyBatis 연결
4.5.1 SqlSessionFactory 객체 설정
4.5.2 mybatis-config.xml 파일의 추가
4.5.3 MyBatis의 연결 테스트
4.6 작업 내역의 정리

5. 모델 2 방식과 스프링 MVC
5.1 모델 2 패턴의 이해
5.1.1 모델 2에서 Front Controller 패턴으로
5.1.2 스프링 MVC의 구조
5.2 스프링 MVC의 컨트롤러
5.2.1 Spring Project의 servlet-context.xml 파일
5.2.2 스프링 MVC에서 주로 사용하는 애노테이션의 종류
5.2.3 기초적인 컨트롤러 생성 실습
5.3 WAS없이 컨트롤러를 테스트하기

6. 스프링 + MyBatis
6.1 테이블 생성 및 개발 준비
6.1.1 데이터베이스의 테이블 생성
6.1.2 도메인 객체를 위한 클래스의 설계
6.2 DAO 인터페이스의 작성
6.3 XML Mapper의 작성
6.3.1 Mapper 파일의 저장 경로
6.3.2 XML Mapper의 작성
6.3.3 myBatis-Spring에서 XML Mapper 인식
6.4 DAO 인터페이스의 구현
6.4.1 SqlSessionTemplate의 설정
6.4.2 구현 클래스 작성하기
6.5 스프링에 빈으로 등록하기
6.6 테스트 코드의 작성
6.7 MyBatis의 로그 log4jdbc-log4j2
6.8 Mybatis의 #{ } 문법
6.9 정리

PART 2 기본적인 기능의 게시물 관리

1. 등록, 수정, 삭제, 조회 기능의 구현
1.1 개발 목표 인식
1.2 각 영역에 따른 개발의 준비
1.3 프로젝트의 생성
1.4 개발 전 준비 - 데이터베이스 관련
1.4.1 DataSource의 등록
1.4.2 DataSource의 테스트
1.4.3 개발 패키지 구성
1.4.4 테이블의 생성 작업
1.4.5 테스트를 위한 SQL 준비
1.5 스프링의 UTF-8 처리 필터 등록
1.6 CSS, JavaScript 준비
1.6.1 프로젝트의 템플릿 적용
1.7 작업 내역 정리

2. 영속(persistence) 계층, 비즈니스 계층
2.1 BoardVO의 작성
2.2 DAO의 생성과 XML Mapper 작업
2.2.1 XML 네임스페이스의 추가
2.2.2 SessionFactory, SqlSessionTemplate의 추가
2.2.3 BoardDAO의 생성
2.2.4 XML Mapper에서의 SQL 처리
2.2.5 BoardDAO의 구현 클래스 BoardDAOImpl
2.2.6 BoardDAO의 테스트
2.2.7 <typeAliases>의 적용
2.3 계층별 구현 - 비즈니스 계층
2.3.1 비즈니스 계층의 구현
2.3.2 비즈니스 계층의 테스트

3. 등록 구현 - 컨트롤러와 프레젠테이션 계층
3.1 컨트롤러의 구현
3.1.1 컨트롤러 관련 고민들
3.1.2 컨트롤러의 선언
3.2 컨트롤러의 동작 확인과 루트 경로 지정
3.3 뷰(view)의 구현 - 등록
3.3.1 컨트롤러에서의 데이터 전달
3.3.2 결과 페이지의 문제점 - 새로 고침
3.3.3 리다이렉트(redirect)와 결과 데이터
3.3.4 RedirectAttributes를 이용한 숨김 데이터의 전송

4. 전체 목록 구현
4.1 컨트롤러의 완성 및 JSP의 완성
4.1.1 각 목록에 링크 처리하기
4.2 목록에 추가로 구현해야 하는 사항들

5. 조회 구현
5.1 BoardController의 기능 추가와 뷰 처리
5.1.1 조회용 페이지 작성
5.2 수정, 삭제로의 링크 처리

6. 삭제/수정 처리
6.1 삭제 처리
6.2 수정 처리

7. 예외 처리
7.1 예외 처리에 대한 팁
7.1.1 Exception을 화면으로 전달하기

8. 페이징 처리 - 영속(persistence) 계층, 비즈니스 계층
8.1 페이징 처리 방식
8.1.1 페이징 처리의 원칙
8.2 페이징 처리 개발에 필요한 지식
8.2.1 MySQL의 limit를 이용한 페이지 출력 SQL
8.3 MyBatis의 BoardDAO 처리
8.3.1 BoardDAO, XML Mapper, BoardDAOImpl의 처리
8.3.2 페이징 처리의 SQL 테스트
8.4 DAO 처리를 도와줄 Criteria 클래스 만들기
8.4.1 BoardDAO 인터페이스의 수정
8.4.2 XML Mapper의 수정
8.4.3 BoardDAOImpl의 수정
8.4.4 BoardDAOTest에서의 테스트 작업
8.5 BoardService 수정하기

9. 페이징 처리 -컨트롤러와 프레젠테이션 계층
9.1 1차 화면 테스트
9.2 화면 하단의 페이징 처리
9.2.1 endPage 구하기
9.2.2 startPage 구하기
9.2.3 totalCount와 endPage의 재계산
9.2.4 prev와 next의 계산
9.3 페이징 처리용 클래스 설계하기
9.4 BoardController와 뷰 처리
9.4.1 listPage.jsp의 처리
9.5 페이징을 위한 SQL 문의 처리
9.5.1 BoardDAO의 수정
9.5.2 XML Mapper의 수정
9.5.3 BoardDAOImpl의 수정
9.5.4 BoardService/BoardServiceImpl의 수정
9.5.5 BoardController의 수정
9.6 페이징 처리의 개선을 위한 Tip
9.6.1 스프링 MVC의 UriComponentsBuilder를 이용하는 방식
9.6.2 JavaScript를 이용하는 링크의 처리
9.7 목록 페이지와 정보 유지하기
9.7.1 BoardController의 수정
9.7.2 readPage.jsp의 작성
9.7.3 수정 페이지와 삭제 페이지의 처리

10. 검색 처리와 동적 SQL
10.1 검색에 필요한 데이터와 SearchCriteria
10.2 SearchBoardController의 작성
10.2.1 JSP 페이지의 준비
10.3 검색에 필요한 JSP 수정
10.3.1 searchType과 keyword 링크 처리
10.3.2 검색 버튼의 동작 처리
10.4 MyBatis 동적 SQL
10.4.1 BoardDAO의 수정
10.4.2 XML Mapper 수정
10.4.3 BoardDAOImpl의 수정
10.4.4 BoardDAO의 테스트
10.4.5 동적 SQL 문의 추가
10.5 BoardService와 SearchBoardController의 수정
10.6 조회, 수정, 삭제 페이지의 처리
10.6.1 게시물의 조회 처리
10.6.2 게시물의 삭제 처리
10.6.3 게시물의 수정 처리
10.7 등록 페이지 처리
10.8 최종적인 결과 확인
10.9 정리

PART 3 Ajax 댓글 처리

1. RestController와 Ajax
1.1 @RestController의 소개
1.2 예제 프로젝트의 생성
1.3 테스트용 컨트롤러 생성하기
1.3.1 @RestController의 용도
1.3.2 단순 문자열의 경우
1.3.3 루트 컨텍스트로 실행하기
1.3.4 객체를 JSON으로 반환하는 경우
1.3.5 컬렉션 타입의 객체를 반환하는 경우
1.3.6 ResponseEntity 타입

2. 댓글 처리와 REST
2.1 Advanced REST Client를 이용한 테스트
2.2 REST와 Ajax
2.3 댓글 처리를 위한 준비
2.3.1 전달 방식과 처리 방식의 결정
2.3.2 데이터 전송 방식의 결정
2.3.3 댓글을 위한 테이블 설정
2.3.4 댓글을 위한 도메인 객체 설계
2.3.5 ReplyDAO
2.3.6 ReplyService/ReplyServiceImpl 작성
 
3. REST 방식의 ReplyController 작성
3.1 등록 처리
3.2 특정 게시물의 전체 댓글 목록의 처리
3.3 수정 처리
3.3.1 HiddenMethod의 활용
3.4 삭제 처리
3.5 페이징 처리
3.5.1 ReplyDAO 처리
3.5.2 XML Mapper 처리
3.5.3 ReplyDAOImpl 처리
3.5.4 ReplyService 페이징 처리
3.5.5 ReplyController에서의 페이징 처리

4. 화면에서의 Ajax 호출
4.1 개발의 순서 결정
4.1.1 테스트를 위한 컨트롤러와 JSP
4.2 전체 댓글 목록의 테스트
4.2.1 전체 댓글 목록 출력
4.2.2 전체 목록에 대한 함수 처리
4.3 댓글 등록 화면 및 테스트
4.3.1 jQuery의 $.post( )를 사용하지 않는 이유
4.3.2 댓글 등록 후 전체 댓글 목록의 갱신
4.4 댓글 조회 및 수정/삭제
4.4.1 수정과 삭제를 위한 <div>
4.4.2 <div>에 댓글 보이기
4.4.3 삭제 호출하기
4.4.4 수정 작업 처리하기
4.5 댓글의 페이징 처리
4.5.1 댓글 페이지를 위한 <ul> 처리
4.5.2 페이지 번호 이벤트 처리
 
5. 게시물 관리의 댓글 적용
5.1 조회 화면의 수정
5.2 handlebars를 이용한 템플릿
5.2.1 handlebars 사용 연습
5.3 댓글 목록 처리
5.3.1 댓글 목록의 이벤트 처리
5.3.2 댓글 페이징의 이벤트 처리
5.4 새로운 댓글의 등록
5.4.1 댓글 등록의 이벤트 처리
5.5 수정과 삭제를 위한 Modal창
5.5.1 각 댓글의 버튼 이벤트 처리
5.6 수정과 삭제의 처리
5.7 정리

PART 4 AOP와 트랜잭션 처리

1. Spring의 AOP와 트랜잭션 관리
1.1 AOP라는 용어와 의미
1.1.1 AOP와 관련된 용어
1.1.2 Advice의 종류

2. 샘플 프로젝트의 생성과 AOP의 적용 준비
2.1 추가해야 하는 라이브러리와 설정
2.1.1 root-context.xml의 설정
2.2 샘플용 테이블 설계
2.3 샘플용 도메인 객체, DAO, XML Mapper, 서비스
2.3.1 도메인 객체 MessageVO
2.3.2 DAO 설정
2.4 서비스 객체 설정

3. AOP 연습하기
3.1 Advice 생성하기
3.1.1 SampleAdvice의 작성
3.2 컨트롤러의 작성과 테스트하기
3.3 실행 시에 전달되는 파라미터 파악하기
3.4 가장 강력한 Around

4. Spring의 트랜잭션 처리
4.1 트랜잭션에 대한 기본 설명
4.1.1 트랜잭션의 기본 원칙
4.1.2 트랜잭션을 처리하는 상황 이해하기
4.2 @Transactional 애노테이션
4.3 트랜잭션 매니저의 설정
4.3.1 root-context.xml의 처리
4.4 트랜잭션 적용 테스트
4.4.1 정상적인 경우의 테스트
4.4.2 트랜잭션이 처리되지 않은 비정상적인 경우의 테스트
4.4.3 MessageService의 트랜잭션 처리 후 테스트
4.4.4 트랜잭션에 따른 로그 변화
4.5 @Transactional의 적용 순서

5. 게시물의 댓글에 따른 트랜잭션 처리
5.1 댓글 카운트의 처리
5.1.1 BoardVO의 변경
5.1.2 boardMapper.xml의 SQL 문 변경
5.1.3 BoardDAO, ReplyDAO 변경
5.1.4 ReplyServiceImpl의 수정
5.1.5 조회 화면의 댓글 수 출력
5.1.6 조회 화면에서 댓글의 숫자 출력
5.2 조회 숫자의 처리
5.2.1 BoardDAO, XML Mapper, BoardDAOImpl의 처리
5.2.2 BoardService의 처리
5.3 정리

PART 5 게시물의 첨부파일 기능

1. 스프링 MVC의 파일 업로드
1.1 파일 업로드의 활용
1.2 예제 프로젝트의 생성
1.2.1 실습을 위한 라이브러리 추가
1.2.2 파일 업로드 관련 <bean> 설정
1.3 일반적인 파일 업로드 이해하기
1.3.1 POST 방식의 파일 업로드 처리
1.3.2 업로드 파일의 저장
1.3.3 <iframe>을 이용한 파일 업로드의 결과 처리
1.4 Ajax 방식의 파일 업로드
1.4.1 Ajax 업로드용 컨트롤러와 JSP작성하기
1.4.2 이벤트 처리하기
1.4.3 FormData를 이용한 서버 호출

2. 전송된 파일의 저장
2.1 파일 업로드용 클래스 설계하기
2.1.1 업로드 기능의 설계
2.1.2 업로드 폴더의 생성 처리
2.1.3 썸네일 생성하기
2.1.4 최종적인 파일 업로드 순서
3. UploadController의 재구성

4. 전송된 파일을 화면에 표시하기
4.1 파일 데이터 전송하기
4.1.1 UploadController의 파일 전송 기능 구현
4.1.2 일반 파일인 경우의 다운로드 테스트
4.1.3 이미지 타입의 파일인 경우의 테스트
4.2 JSP에서 파일 출력하기
4.2.1 파일 링크 처리

5. 첨부파일의 삭제
5.1 UploadController의 삭제 처리
5.2 JSP에서의 첨부파일 삭제 처리
5.2.1 파일 삭제 후 화면에서의 제거

6. 게시물 등록의 파일 업로드
6.1 개발 목표의 정리
6.2 게시물 등록 준비
6.2.1 데이터베이스에 테이블 추가
6.2.2 도메인 객체의 변화
6.2.3 BoardDAO의 변화
6.2.4 BoardService의 변경과 트랜잭션의 처리
6.3 게시물 등록을 위한 화면 처리
6.3.1 파일 업로드를 위한 register.jsp 페이지 수정하기
6.3.2 업로드 된 파일 이름의 처리를 위한 JavaScript
6.3.3 <form> 태그의 submit 처리

7. 조회 페이지와 파일 업로드
7.1 BoardVO 객체의 조회
7.1.1 BoardDAO의 처리
7.1.2 BoardService의 처리
7.1.3 컨트롤러의 수정
7.2 조회 화면에서의 처리
7.2.1 원본 이미지의 조회와 다운로드 처리

8. 게시물 수정, 삭제 작업의 파일 업로드
8.1 수정 작업 시의 BoardDAO
8.1.1 수정 작업에 대한 서비스의 트랜잭션 관리
8.1.2 수정 화면의 처리
8.1.3 삭제 처리
8.1.4 삭제 화면의 처리
8.2 정리

PART 6 인터셉터(Interceptor)를 활용하는 로그인 처리

1. Spring MVC의 인터셉터(Interceptor)
1.1 Filter와 인터셉터의 공통점과 차이점
1.2 Spring AOP 기능과 HandlerInterceptor의 차이
1.2.1 HandlerInterceptorAdapter 클래스
1.3 예제를 위한 프로젝트의 생성
1.3.1 패키지의 생성과 SampleInterceptor
1.3.2 servlet-context.xml의 인터셉터 설정
1.3.3 HomeController의 수정
1.3.4 SampleInterceptor의 처리
1.3.5 실행 및 결과
1.4 인터셉터의 request, response 활용하기
1.4.1 preHandle( )의 Object 파라미터
1.4.2 postHandle( )을 이용해서 추가적인 작업하기

2. HttpSession을 이용하는 로그인 처리
2.1 준비 작업
2.1.1 테이블 생성 및 객체 처리
2.1.2 UserDAO의 생성 및 SQL 처리
2.1.3 UserService와 UserServiceImpl 처리
2.2 컨트롤러의 처리
2.2.1 UserController의 작성
2.3 LoginInterceptor의 작성 및 설정
2.3.1 LoginInterceptor의 설정
2.3.2 로그인의 화면 처리
2.4 AuthInterceptor의 작성
2.4.1 AuthInterceptor의 설정
2.4.2 자동 페이지의 이동 처리

3. 게시물의 세부 기능 적용
3.1 인터셉터 URI mapping
3.1.1 servlet-context.xml의 설정
3.2 각 JSP 별 로그인 처리
3.2.1 게시물의 등록 페이지
3.2.2 게시물의 조회 페이지

4. 자동 로그인과 쿠키
4.1 쿠키를 이용하는 자동 로그인 방식
4.1.1 LoginInterceptor에서의 쿠키 생성하기
4.1.2 브라우저 종료 후 다시 접속하기
4.1.3 자동 로그인 구상하기
4.2 자동 로그인의 구현
4.2.1 데이터베이스의 변경
4.2.2 코드의 변경
4.2.3 UserController의 변경
4.2.4 AuthInterceptor의 변경
4.2.5 자동 로그인 테스트
4.3 로그아웃 처리
4.4 보완이 필요한 부분
4.5 정리

부록

1. MyBatis의 Mapper 인터페이스 활용
1.1 예제 프로젝트의 생성
1.1.1 XML 네임스페이스 지정
1.1.2 DataSource, SqlSessionFactory의 설정
1.2 Mapper 인터페이스의 작성
1.3 인터페이스 Mapper의 인식
1.3.1 자동으로 매퍼 인식하기
1.4 Mapper의 테스트
1.5 @Param을 이용한 다중 파라미터 처리
1.6 Mapper 인터페이스와 XML을 같이 활용하기
1.6.1 root-context.xml 파일의 수정
1.7 Dynamic SQL과 @SelectProvider
1.7.1 #{id}와 ${id}, @SelectProvider

2. 스프링 부트를 이용한 프로젝트 생성
2.1 STS 상에서 스프링 부트 프로젝트 생성하기
2.1.1 프로젝트의 실행
2.2 Controller 작성
2.3 스프링 부트에서의 데이터베이스 설정
2.3.1 application.properties 파일 설정
2.3.2 DataSource의 설정과 테스트
2.3.3 DataSource의 테스트
2.4 스프링 부트에서의 MyBatis 설정
2.4.1 SqlSessionFactory의 설정
2.5 Mapper 인터페이스의 작성과 설정 실습
2.5.1 도메인 클래스의 설계
2.5.2 Mapper 인터페이스의 작성
2.5.3 Mapper의 인식
2.5.4 Mapper 인터페이스의 테스트
2.5.5 XML 매퍼를 이용해야 하는 상황
2.6 스프링 부트의 뷰(View) 처리
2.6.1 JSP를 위한 설정 변경
2.6.2 컨트롤러의 작성 및 테스트
2.6.3 한글 테스트와 필터 처리
2.6.4 인터셉터의 설정
2.7 Thymeleaf의 설정

찾아보기

 

신고
Posted by 남가람북스 남가람북스

댓글을 달아 주세요

  1. 목이 2015.09.20 11:31 신고 Address Modify/Delete Reply

    스프링을 공부중인데 이 책의 도움을 많이 받고있습니다. 스프링이 이렇게 쉽고 재미난 프레임워크인줄 전에는 몰랐습니다. 앞으로도 좋은 책 많이 내주세요^^ !!

  2. 구멍가게 코딩단/남가람북스 2015.09.20 11:34 신고 Address Modify/Delete Reply

    감사합니다! 저희 남가람북스는 독자에게 도움이 되는 좋은 도서를 계속해서 만들어 가겠습니다.
    앞으로 많은 응원 부탁드립니다.

  3. 최재영 2015.10.06 21:53 신고 Address Modify/Delete Reply

    안녕하세요. 이번에 책을 알라딘에서 구입 해서 보게 되었습니다.^^
    어느정도 기본을 땐 친구들에게 어떤 책으로 다시 한번 다지는게 좋을까 싶어 이 책을 고르게 되었는데요. 혹시 EBOOK으로도 나올 계획이 있으신가요?

    • 구멍가게 코딩단/남가람북스 2015.10.06 21:58 신고 Address Modify/Delete

      안녕하세요, 남가람북스입니다.
      책이 출간된 지 얼마되지 않아 아직 eBook 발행 계획은 없습니다. 감사합니다.

  4. 히바리쿄야 2015.11.25 14:35 신고 Address Modify/Delete Reply

    예스 24 에서 책 구입해서 실습 하고 있습니다. 그런데
    197 페이지 실습하면서 이해가 안되는 점이 있네요 우선 ex01 로 실습을 했는데
    서버탭에서 ex01 로 프로젝트를 추가한다는 내용을 이해를 못하겠네요
    프로젝트 이름이 같으면 중복되서 같은 이름은 추가가 안되는 것으로 알고 있구요
    또한 톰캣 서버에 모듈즈 로 가보면 패스 가 /controller 로 나오지
    않고 /web 으로 나옵니다.. 그래서 모듈 추가 해서 경로를 콘트롤러 라고 바꿨는데도
    /web 으로 고정되더군요 여기서 부터 막히고 있어서 질문 드립니다..
    그리고 질문 게시판 이 있으면 좋겠네요 질문 할 곳도 없어서 당황스럽네요

    • zerockcode 2016.02.15 21:41 신고 Address Modify/Delete

      너무나 답변이 늦어서 죄송합니다.

      구멍가게 코딩단의 블로그가 있어서 대부분 질문이 그쪽으로 올 것이라고 생각하고 소홀한 점 사과드립니다.

  5. 김동억 2016.01.21 12:10 신고 Address Modify/Delete Reply

    107페이지 중간부분에 보면
    "(프로젝트 생성 시 마지막 패키지의 이름이 경로가 되므로 지금은 /web경로가 됩니다.)"
    이 부분은 완전 잘못된 설명 아닌가요?
    패키지와 컨텍스트 패스가 무슨 관계인가요..

    • zerockcode 2016.02.15 21:47 신고 Address Modify/Delete

      책을 집필할 당시의 STS는 MVC 프로젝트의 패키지의 마지막 이름이 경로로 설정되었습니다.

      최신버전에서는 약간의 차이가 있습니다.
      재판 발행시에 수정하도록 하겠습니다.

      답변이 너무 늦어서 죄송합니다.

  6. BruceLee 2016.01.30 00:10 신고 Address Modify/Delete Reply

    책 잘보고 있습니다.
    책을 보고 실습을 하던중에 381page에서 Advanced REST Client로 테스트 하는 부분이 있는데...
    책과 조금 달라서 문의합니다.
    책에서는 Set "Content-Type" header to overwrite this value. 에 Select창이 있어서
    application/json설정 할 수 있다고 하던데 실제로 그 사이트에는 그밑에 Select 창이 없습니다.
    그리고 계속 아래의 에러가 뜨는데 해결을 못하겠네요. 빨리 진도 나가고 싶은데 막히니깐 힘드네여
    도와 주십시오
    <h4>Could not read document: Can not instantiate value of type [simple type, class org.zerock.domain.ReplyVO] from String value ('replytext'); no single-String constructor/factory method
    at [Source: java.io.PushbackInputStream@c8c21; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class org.zerock.domain.ReplyVO] from String value ('replytext'); no single-String constructor/factory method
    at [Source: java.io.PushbackInputStream@c8c21; line: 1, column: 1]</h4>
    <ul>

  7. zerockcode 2016.02.15 21:57 신고 Address Modify/Delete Reply

    얼마전에 새로 나온 버전에서는 Header 부분을 Content-Type: application/json 으로 수정하셔서 테스트 하시면 됩니다.

    답변이 너무 늦어서 죄송합니다.

  8. 2Be 2016.02.21 20:09 신고 Address Modify/Delete Reply

    열심히 책보고 거의 다 만들었는데 세션값이 비는 문제가 생겨서 질문드립니다.

    1. 첫페이지 home메서드에서 로그인할때 받아온 세션속성값(login)을 유지할 수 있는 방법이 있는지 문의드립니다.
    로그인→UserController(loginPost)→로그인인터셉터postHandle통과→loginPost.jsp에서 첫페이지로 오도록 redirect→HomeController home메서드에서 return 'index'로 오도록 하면, 로그인인터셉터postHandle할때 세션에 지정한 login속성값이 home메서드에서 null값으로 들어오는 현상이 생깁니다.

    2. request.getSession();을 컨트롤러와 인터셉터에 각각 다르게 true, false로 지정해야 하는지요?

    3. 페이지마다 <%@ page session="false"%>를 없애거나 true로 바꿔줘야 하는지요?

    4. 519p에 파일업로드예제프로젝트 생성시 반드시 경로를 '/'로 해야 하는 이유가 궁금합니다.
    저는 '도메인명/프로젝트명'으로 만들어야 해서, CSS경로는 다 바꿔주고 하는 중이거든요.

    5. 194p, BoardController 글쓰기메서드인 registGET(BoardVO board, Model model)는 페이지 이동만 하므로 void반환형에 따라 요청경로값(value="/register")만 반환하므로, registerGET()처럼 매개변수가 없어도 registerPOST메서드 처리에 문제가 없지 않는지 궁금합니다.

  9. 제록코드 2016.02.24 14:55 신고 Address Modify/Delete Reply

    제가 질문을 완벽히 이해했는지 조심스럽지만.. 아래와 같이 생각하시면 될 듯 합니다.

    1. 질문하신 내용이 로그인 후에 세션 자원이 유지되지 않는 문제이신 듯 합니다만.. 우선적으로 home( )의 파라미터를 HttpSession 으로 지정하시고 확인해 보시는게 맞을 듯 합니다. 책의 예제는 세션에 path를 지정하므로 이 역시 확인이 필요합니다.

    2. 둘 중 하나만 지정하셔도 큰 문제는 없습니다.

    3. 서버에서 셰션을 처리해야하면 서버에 부담을 줄 수 있습니다. 셰션 자원을 사용할 페이지와 사용하지 않는 페이지를 구분하는 습관을 가지시는게 좋습니다. (주로 튜닝관련 이슈입니다)

    4. '/' 경로를 기준으로 하면 모든 경로는 절대 경로로 작성할 수 있도록 통일성 있게 진행할 수 있습니다. 인쿠르드나 링크에서 상대 경로를 이용하면 가끔 꼬일 수가 있으니 절대 경로를 이용하시는게 좋습니다.


    5. POST방식의 경우라면 대부분 데이터를 처리하기 위해서이므로 파라미터가 있는 것이 일반적입니다. 파라미터가 없어도 큰 문제는 없습니다.

  10. 강사 2016.06.01 15:32 신고 Address Modify/Delete Reply

    코드로 배우는 스프링 웹 프로젝트 강의할 때 쓰면 좋을 ppt 자료 교안 있는지 궁금합니다

  11. 남가람북스 남가람북스 2016.06.01 15:35 신고 Address Modify/Delete Reply

    네, 강의자료도 있습니다. 메일로 연락 주시면 보내드리겠습니다. ngrbooks@naver.com 감사합니다.

  12. 김은찬 2016.06.23 16:15 신고 Address Modify/Delete Reply

    136페이지에 스프링에서 해당 패키지를 스캔하지 않으면 제대로 스프링의 빈으로 등록되지 못한다. 이 처리는 root-context.xml을 이용해서 아래오 같이 설정한다. 라고 적혀 있는 데, 안되서 찾다 보니까. root-context.xml에 추가하는 게 아니라, servlet-context.xml에 추가하니까 되네요. 만약 제가 틀렸다면 답신 부탁드립니다. 이 책 정주행 중이거든요.

  13. 쿠키 2016.06.23 16:44 신고 Address Modify/Delete Reply

    servlet-context.xml의 경우는 웹과 관련된 설정만을 분리하기 위해서 사용합니다.

    root-context.xml에 추가하시는게 맞는 설정인데요..

    이게 잘못되었다면 대부분은 servlet-context.xml의 component-scan에서 문제를 일으키는 경우가 있을 수 있습니다.

    가능하시면 cookie_00@naver.com으로 지금 작성하시는 프로젝트 코드를 보내주시면 좀 더 자세히 볼 수 있을 겁니다.

    ...그리고 cafe.naver.com/gugucoding 카페를 제가 우선적으로 확인하기 때문에 가능하시면 이쪽으로 질문을 올려주시면 더 빨리 해결하실 수 있을 겁니다^^

  14. 이지훈 2016.07.27 15:59 신고 Address Modify/Delete Reply

    혹시 책에서 환경설정 할때 설치 파일 버전은 없나요?? 이제 막 스프링 한번 시작해보려 하는데 버전이 많이 틀린거 같네요.;;

    • 남가람북스 2016.07.27 17:20 신고 Address Modify/Delete

      안녕하세요. 남가람북스입니다. 저자 선생님께서 운영하시는 카페에 질문을 올려 주시면 빠른 시간 내에 답을 드릴 것입니다. 카페 주소는 cafe.naver.com/gugucoding 입니다. 감사합니다.

  15. 강태민 2016.07.31 21:59 신고 Address Modify/Delete Reply

    329쪽 동적SQL문에서

    <if test="searchType == 't'.toString()"> and title like CONCAT('%',#{keyword},'%')</if>
    이렇게 하면 numberformatexception: for input string:"t"라는 에러가 뜹니다.

    나름 구글링을 열심히 해서

    1. <if test='searchType == "t"'> : 쌍 따옴표와 홈따옴표의 위치 변경

    2. <if test="searchTyp e== &quot;t&quot;"> - HTML 코드 사용

    3. <if test="searchType == 't'.toString()"> - toString() 함수 사용

    이런식의 해결방법을 찾아봤지만 다 numberformatexception가 발생합니다.

    다만, <if test="searchType == 't'"> 그리고 <if test="searchType.equals('t')"> 이 두 가지 방법은 에러가 발생하지 않고
    정상적으로 테스트가 완료됩니다. 하지만, if문이 무조건 false가 나오는 것 같습니다.(if절 내의 쿼리문이 전혀 실행되지 않음)

    구글링을 해도 저에게 맞는 해결방법이 없네요. 꼭 해결방법 부탁드립니다.

  16. 도사 2016.10.31 22:00 신고 Address Modify/Delete Reply

    저 역시 몇일전에 책을 구입했는데..
    저자 카페는 카페 회원만 볼 수 있게 되어있는데..
    꼭 카페에 가입히야하는지요.

    • 구코단 2016.10.31 23:26 신고 Address Modify/Delete

      구멍가게 코딩단 카페는 네이버 카페에 회원제로 관리됩니다.

      굳이 회원제로 운영하는 이유는 최신 원고나 수정에 대해서 회원분들에게 우선적으로 내용을 제공하기 위해서 입니다.

      양해부탁드립니다

  17. 도사 2016.11.16 11:52 신고 Address Modify/Delete Reply

    저의 개발 환경
    1. windows 7 ult, 64bit
    2. java C:\Program Files\Java\jdk1.8.0_111
    jre C:\Program Files\Java\jre1.8.0_111
    3. Spring Tool suite 3.8.2 RELEASE build id : 201610040743
    4. tomcat 8.0
    5. 1장에서 부터 오류입니다. 뭐가 잘못 된건지 알 수가 없어서...
    6. 오류 내용 -- 아래 --
    11월 16, 2016 11:42:03 오전 org.apache.tomcat.util.digester.SetPropertiesRule begin
    경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:ex00' did not find a matching property.
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Server version: Apache Tomcat/8.0.38
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Server built: Oct 6 2016 20:51:55 UTC
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Server number: 8.0.38.0
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: OS Name: Windows 7
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: OS Version: 6.1
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Architecture: amd64
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Java Home: C:\Program Files\Java\jre1.8.0_111
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: JVM Version: 1.8.0_111-b14
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: JVM Vendor: Oracle Corporation
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: CATALINA_BASE: E:\work\spring\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: CATALINA_HOME: E:\Tomcat80
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Command line argument: -Dcatalina.base=E:\work\spring\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Command line argument: -Dcatalina.home=E:\Tomcat80
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Command line argument: -Dwtp.deploy=E:\work\spring\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Command line argument: -Djava.endorsed.dirs=E:\Tomcat80\endorsed
    11월 16, 2016 11:42:03 오전 org.apache.catalina.startup.VersionLoggerListener log
    정보: Command line argument: -Dfile.encoding=MS949
    11월 16, 2016 11:42:03 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre1.8.0_111\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;.
    11월 16, 2016 11:42:03 오전 org.apache.coyote.AbstractProtocol init
    정보: Initializing ProtocolHandler ["http-nio-8080"]
    11월 16, 2016 11:42:04 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
    정보: Using a shared selector for servlet write/read
    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol init
    정보: Initializing ProtocolHandler ["ajp-nio-8009"]
    11월 16, 2016 11:42:04 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
    정보: Using a shared selector for servlet write/read
    11월 16, 2016 11:42:04 오전 org.apache.catalina.startup.Catalina load
    정보: Initialization processed in 443 ms
    11월 16, 2016 11:42:04 오전 org.apache.catalina.core.StandardService startInternal
    정보: Starting service Catalina
    11월 16, 2016 11:42:04 오전 org.apache.catalina.core.StandardEngine startInternal
    정보: Starting Servlet Engine: Apache Tomcat/8.0.38
    11월 16, 2016 11:42:04 오전 org.apache.catalina.core.ContainerBase startInternal
    심각: A child container failed during start
    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/web]]
    at java.util.concurrent.FutureTask.report(Unknown Source)
    at java.util.concurrent.FutureTask.get(Unknown Source)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:915)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:871)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/web]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    ... 6 more
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@50e4dcfb]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4969)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 6 more
    Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@4a3c3471]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:135)
    at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:706)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 9 more
    Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: invalid LOC header (bad signature)
    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:113)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    ... 12 more
    Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
    at java.util.zip.ZipFile.read(Native Method)
    at java.util.zip.ZipFile.access$1400(Unknown Source)
    at java.util.zip.ZipFile$ZipFileInputStream.read(Unknown Source)
    at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at sun.misc.IOUtils.readFully(Unknown Source)
    at java.util.jar.JarFile.getBytes(Unknown Source)
    at java.util.jar.JarFile.getManifestFromReference(Unknown Source)
    at java.util.jar.JarFile.getManifest(Unknown Source)
    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:111)
    ... 13 more

    11월 16, 2016 11:42:04 오전 org.apache.catalina.core.ContainerBase startInternal
    심각: A child container failed during start
    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
    at java.util.concurrent.FutureTask.report(Unknown Source)
    at java.util.concurrent.FutureTask.get(Unknown Source)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:915)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:441)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:787)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:629)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: org.apache.catalina.LifecycleException: A child container failed during start
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:871)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 6 more

    11월 16, 2016 11:42:04 오전 org.apache.catalina.startup.Catalina start
    심각: The required Server component failed to start so Tomcat is unable to start.
    org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:629)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:787)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 7 more
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:441)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 9 more
    Caused by: org.apache.catalina.LifecycleException: A child container failed during start
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:923)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 11 more

    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol pause
    정보: Pausing ProtocolHandler ["http-nio-8080"]
    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol pause
    정보: Pausing ProtocolHandler ["ajp-nio-8009"]
    11월 16, 2016 11:42:04 오전 org.apache.catalina.core.StandardService stopInternal
    정보: Stopping service Catalina
    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol destroy
    정보: Destroying ProtocolHandler ["http-nio-8080"]
    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol destroy
    심각: Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"]
    java.lang.NullPointerException
    at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:316)
    at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:492)
    at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:821)
    at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:551)
    at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.core.StandardService.destroyInternal(StandardService.java:589)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.core.StandardServer.destroyInternal(StandardServer.java:877)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)

    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol destroy
    정보: Destroying ProtocolHandler ["ajp-nio-8009"]
    11월 16, 2016 11:42:04 오전 org.apache.coyote.AbstractProtocol destroy
    심각: Failed to destroy end point associated with ProtocolHandler ["ajp-nio-8009"]
    java.lang.NullPointerException
    at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:316)
    at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:492)
    at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:821)
    at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:551)
    at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.core.StandardService.destroyInternal(StandardService.java:589)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.core.StandardServer.destroyInternal(StandardServer.java:877)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)

  18. 도란도란 2017.07.11 09:50 신고 Address Modify/Delete Reply

    정말 완벽합니다. 굳굳

  19. 장병학 2017.08.07 15:06 신고 Address Modify/Delete Reply

    8판 462쪽에 SQL문 문의입니다.
    책에는 tbl_message테이블을 생성하는 쿼리문이 두번 똑같이 반복되어 나오는데요,
    461쪽을 보면 tbl_user라는 테이블을 함께 사용하는걸로 보입니다.
    아마, 하나는 tbl_message테이블, 하나는 tbl_user테이블을 생성하는 쿼리문이 와야하는거 같은데...
    지금 이대로 쿼리문을 작성하면 동일한 테이블을 생성하는거에서 걸릴테고,
    밑에 외래키지정에도 없는테이블의 없는 컬럼값이라고 오류가 뜰텐데...
    정오표는 책과 동일하네요. 수정된 내용이 없어요.

티스토리 툴바