-
도서 판매처
-
실습 진행 환경
-
개발도구
- STS 3, Eclipse, IntelliJ, VS Code
-
JDK
- Temurin OpenJDK 17
- 책 환경: Oracle JDK 1.8
-
Database
-
Oracle 18c Express Edition
- 책 환경: Oracle 11c Express Edition
-
- 일부 단순 프로젝트, 최종 프로젝트
- Java 기반 설정과 Mybatis Dynamic SQL를 적용한
최종장 프로젝트는 Oracle이 없더라도 Pull 만 받아서 바로 실행가능하도록 HyperSQL DB Embedded 적용 목표.- DB만 HyperSQL DB로 바꾸는 것은 의미가 없는 것 같다. Oracle로 쓰기로 했음. 완료 후에 여유있을 때, jex 최종장 프로젝트를 JPA로 바꾸는 것이 나을 것 같다.
- Java 기반 설정과 Mybatis Dynamic SQL를 적용한
- 일부 단순 프로젝트, 최종 프로젝트
-
-
WAS
- Jetty 10.x (Maven Jetty 플러그인 실행)
- Tomcat 9.0.x (Cargo Maven 플러그인을 사용해서 실행)
- part-last의 Spring 6 + Servlet 6 프로젝트
- Jetty 12.x
- Tomcat 10.1.x
-
빌드 도구
-
- Part 1. 스프링 개발환경 구축
- Part 2. 스프링 MVC설정
- Part 3. 기본적인 웹 게시물 관리
- Part 4. REST 방식과 Ajax를 이용하는 댓글 처리
- Part 5. AOP와 트랜젝션
- Part 6. 파일 업로드 처리
- Part 7. Spring Web Security를 이용한 로그인 처리
- 부록. IntelliJ와 Gradle을 이용하는 스프링 환경
디펜던시하고 있는 라이브러리들의 버전 관리를 하나의 POM에서 하기 위해서, 부모 POM으로 분리해두었음.
스터디 프로젝트의 성능 모니터링을 할 수 있도록 Scouter를 연동해보았다. 관련 라이브러리만 잘 배치했다면 프로젝트 루트의 배치파일 만 실행하면 바로 연동해서 실행해볼 수 있게 했다.
-
Oracle JDK는 개인 용도 사용이 아닌 경우라면 라이선스 문제가 있을 수 있어, OpenJDK 설치로 소개해주시면 좋을 것 같습니다.
- https://adoptium.net/temurin/archive
- Oracle의 Java SE TCK 테스트 통과
-
Part1에서 lombok의 @Setter를 통해 @Autowired를 붙이는 것을 가이드 해주셨는데, 클래스의 멤버 변수에 직접 @Autowired를 붙일 수 있으므로 반드시 필요한 부분이 아닐 것 같습니다. JDK버전에 따라 코드를 변경해야할 수도 있으므로 필드에 붙이는게 나아보입니다.
-
보통 JUnit 테스트 클래스명은 Test로 끝나는 것이 일반적으로 보였는데, Tests로 하셔서 뭔가 특이하긴했습니다.
-
p92. RootConfig 클래스의 일부에서 sqlSessionFactory.getObject() 반환 부분
- getObject() 메서드가 SqlSessionFactory를 반환하기 때문에 명시적 형변환이 필요없습니다.
-
@Slf4j를 사용하면 로그 구현체를 바꾸더라도 코드 수정이 없어서, @Log4j 보다 나을 것 같긴한데, 연습할 때는 @Slf4j 규칙에 맞게 로깅 부분을 수정했습니다.
-
Eclipse 나 STS 사용시 MyBatipse 플러그인이 Mapper XML 파일 생성 및 작성시 도움이 되었습니다.
-
Part1 - log4jdbc-log4j2 설정관련.. 적용을 하려다, 아래 사유로 적용을 하지 않았습니다.
-
JDK 11, ojdbc8 실행환경
-
2013년 이후로 라이브러리 업데이트가 되지 않고 있음.
-
데이터 소스 생성시 드라이버 클래스로 로깅 라이브러리의 Spy클래스를 쓰는 것에 거부감이 듬.
-
MyBatis에서 처리해주는 로깅 방식 사용
test 리소스의 log4j.xml 에다 mapper에 대한 TRACE 로거를 설정하였습니다.<Logger name="org.fp024.mapper" level="trace"/>
-
결과
INFO : org.fp024.persistence.TimeMapperTest - getTime2 DEBUG: org.fp024.mapper.TimeMapper.getTime2 - ==> Preparing: SELECT sysdate FROM dual DEBUG: org.fp024.mapper.TimeMapper.getTime2 - ==> Parameters: TRACE: org.fp024.mapper.TimeMapper.getTime2 - <== Columns: SYSDATE TRACE: org.fp024.mapper.TimeMapper.getTime2 - <== Row: 2021-03-19 01:02:47 DEBUG: org.fp024.mapper.TimeMapper.getTime2 - <== Total: 1 INFO : org.fp024.persistence.TimeMapperTest - 2021-03-19 01:02:47
MyBatis 3.2 부터 이렇게 할 수 있다고 합니다. -
-
Log4j 1이 End of Life 상태이고 보안취약점이 있어, 개정판에는 Log4j 2로 변경되야할 것 같습니다.
-
가상 머신에 띄어두기위해서 서버 실행/정지 스크립트를 만들고 크론탭으로 서버 시작시 실행되게 하였다.
-
서버 시작 스크립트
-
jetty-start-with-scouter.sh : Scouter 연동해서 Jetty 서버로 시작
-
tomcat-start-with-scouter.sh : Scouter 연동해서 Tomcat 서버로 시작
-
-
서버 정지 스크립트
-
jetty-stop-server.sh : Jetty 서버 종료
-
tomcat-stop-server.sh : Tomcat 서버 종료
cargo:run으로 실행하는 Tomcat 서버의 경우 백그라운드로 실행할 경우 Tomcat 서버는 종료할 수 있지만 그것을 감싼 MavenWrapper프로세스는 고아 프로세스로 남을 수 있다. 왠만하면 백그라운드로 실행하지 말자!
-
-
로그 보기 스크립트
- show-log.sh: 실행 로그 보기 (최초 시작후 로그만 남김, log rotate등은 적용하지 않음, 재부팅 때마다 새로 갱신)
-
crontab -e설정 (백그라운드 실행에 )# Scouter Host Agent 시작 @reboot /home/fp024/apps/scouter/latest/agent.host/host.sh # 게시판 프로젝트 시작 @reboot /home/fp024/git-fp024/learning-spring-web-project-by-code/jetty-start-with-scouter.sh
스크립트에서 사용하는 환경 설정 파일 정의
-
setenv.properties
JAVA_HOME=/home/fp024/JDK/17 SCOUTER_JAVA_AGENT_CONF=scouter/conf/board-webapp.conf SCOUTER_JAVA_AGENT_LIB=/home/fp024/apps/scouter/latest/agent.java/scouter.agent.jar # 최종 진행한 프로젝트 LATEST_PROJECT_HOME=part07/jex06-board
Ctrl+<Shift>+P로 모든 명령 연 다음..- java clean 이라고 입력하면...
Java: Clean Java Language Server Workspace명령이 뜨는데 이것을 실행해주자! 😄
MyBatis Generator Plugin 또는 mybatis-dynamic-sql 버전이 변경된 경우,
💡 생성 코드와 현재 라이브러리 버전의 호환성을 맞추기 위해 모델과 매퍼를 한 번 재생성하는 것을 권장한다.
mvn mybatis-generator:generate그리고 자동생성되는 VO나 Mapper에다가 기능 추가는 자제하자!
VO와 Mapper는 MyBatis Generator로 자동 생성되므로,
가능하면 직접 수정하지 말고 생성된 구조를 그대로 유지하는게 낫다.
추가 기능이나 비즈니스 로직은 service 계층 또는 별도 클래스로 분리하는 것이 좋을 것 같다.
- 각 진행 문서에 작성