Skip to content

Commit 7d96308

Browse files
committed
mybatis-dynamic-sql 적용한 게시판 최종 프로젝트를 Spring 7로 마이그레이션
1 parent 0402d7d commit 7d96308

119 files changed

Lines changed: 9271 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

part-last/README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,29 @@
6666
* 버전환경을 내리고보니 Querydsl 의 insert문 수행시 오류가 난다. 🎃
6767
* Spring Data JPA의 save()로 바꾸고 관련 엔티티에는 `@DynamicInsert`를 붙혔다.
6868

69+
70+
71+
72+
73+
---
74+
75+
## mybatis-dynamic-sql 적용한 프로젝트를 Spring 7로 마이그레이션
76+
77+
* 프로젝트
78+
* [my-board-mds](my-board-mds)
79+
80+
part07의 jex06-board 프로젝트를 Spring 7 + Spring Security 7 + Java 21 환경으로 마이그레이션해보았다.
81+
82+
83+
84+
#### 변경내용
85+
86+
* Spring 5 -> Spring 7
87+
* Spring Security 5.8 -> Spring Security 7
88+
* Tomcat 9 -> Tomcat 11
89+
90+
91+
92+
### 특이사항
93+
94+
* [프로젝트 README 참조..](my-board-mds/README.md)

part-last/my-board-mds/.gitignore

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
HELP.md
2+
target/
3+
4+
# maven-wrapper.properties 만 있어도 jar를 maven-wrapper.jar 를 자동으로 다운로드 받는다.
5+
.mvn/wrapper/*
6+
!.mvn/wrapper/maven-wrapper.properties
7+
8+
!**/src/main/**/target/
9+
!**/src/test/**/target/
10+
11+
### STS ###
12+
.apt_generated
13+
.classpath
14+
.factorypath
15+
.project
16+
.settings
17+
.springBeans
18+
.sts4-cache
19+
.dbeaver
20+
21+
### IntelliJ IDEA ###
22+
.idea
23+
*.iws
24+
*.iml
25+
*.ipr
26+
27+
### NetBeans ###
28+
/nbproject/private/
29+
/nbbuild/
30+
/dist/
31+
/nbdist/
32+
/.nb-gradle/
33+
build/
34+
!**/src/main/**/build/
35+
!**/src/test/**/build/
36+
37+
### VS Code ###
38+
.vscode/
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-Djava.security.egd=file:/dev/./urandom
2+
-Djava.awt.headless=true
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
wrapperVersion=3.3.4
2+
distributionType=only-script
3+
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip

part-last/my-board-mds/README.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# mybatis-dynamic-sql 적용한 프로젝트를 Spring 7로 마이그레이션
2+
3+
* 프로젝트
4+
* [my-board-mds](my-board-mds)
5+
6+
part07의 jex06-board 프로젝트를 Spring 7 + Spring Security 7 + Java 21 환경으로 마이그레이션해보았다.
7+
8+
9+
10+
## 변경내용
11+
12+
* Spring 5 -> Spring 7
13+
* Spring Security 5.8 -> Spring Security 7
14+
* Tomcat 9 -> Tomcat 11
15+
16+
17+
18+
## 특이사항
19+
20+
1. 패스워드 인코더를 DelegatingPasswordEncoder()로 사용했었는데...
21+
22+
```java
23+
@Bean
24+
public PasswordEncoder passwordEncoder() {
25+
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
26+
}
27+
```
28+
29+
스프링 시큐리티 7에서는 BCrypt 형식으로 암호화되어있더라도 `{bcrypt}`를 붙여줘야하나보다.
30+
31+
```java
32+
// 💡 PasswordEncoder를 BCryptPasswordEncoder로 고정하여 사용
33+
// Spring Security 6 까지는 prefix가 없어도 기본으로 BCrypt로 처리가 되었었는데,
34+
// Spring Security 7부터는 prefix가 필요하다. 그래서 일단 BCryptPasswordEncoder로 고정해서 사용해보자!
35+
@Bean
36+
public PasswordEncoder passwordEncoder() {
37+
return new BCryptPasswordEncoder();
38+
}
39+
```
40+
41+
DB에다가 일괄 업데이트를 해도되긴 되는데.. 일단은 이 프로젝트는 `BCryptPasswordEncoder`를 사용하도록 고정해둠.
42+
43+
2. JSON 메시지 컨버터 재설정 방법 변경
44+
45+
원래는 자동 생성된 GSON 컨버터를 제거하고 내가 사용자정의한것 쓰도록 바꿨었는데...
46+
47+
```java
48+
@Override
49+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
50+
converters.removeIf(
51+
httpMessageConverter -> httpMessageConverter.getClass() == GsonHttpMessageConverter.class);
52+
converters.add(GsonHelper.gsonHttpMessageConverter());
53+
}
54+
```
55+
56+
configureMessageConverters를 대신 쓰라고 해서 바꿨다.
57+
58+
```java
59+
@Override
60+
public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) {
61+
builder.withJsonConverter(GsonHelper.gsonHttpMessageConverter());
62+
}
63+
```
64+
65+
66+
67+
68+
69+
## TODO:
70+
71+
- [ ] 이 프로젝트에 먼저 Github 로그인을 먼저 붙여볼까?
72+
- [ ] 이 프로젝트는 아직 Oracle이긴한데... 다른 Part Last 의 프로젝트처럼 간편한 확인 테스트를 위해 HSQLDB로 바꾸는게 좋을 것 같다.
73+
- [ ] 다른 프로젝트엔 tui.editor를 붙여보긴 했는데... 여기도 에디터를 붙여보면 좋을 것 같다.
74+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
@ECHO OFF
2+
SETLOCAL
3+
ECHO [Generate VO, Mapper...]
4+
CALL ..\..\set-jdk-21-env.bat
5+
CALL .\mvnw.cmd mybatis-generator:generate
6+
7+
echo.
8+
echo Build log checked? Press Enter to close...
9+
set /p dummyVar=""
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE generatorConfiguration PUBLIC
3+
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
4+
"https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
5+
<generatorConfiguration>
6+
<!-- MyBatis Dynamic SQL Library를 사용. XML매퍼는 생성하지 않음. -->
7+
<!-- 참조: https://mybatis.org/generator/quickstart.html -->
8+
<context id="MyBatis3DynamicSqlTest" targetRuntime="MyBatis3DynamicSql">
9+
<property name="javaFileEncoding" value="UTF-8"/>
10+
11+
<!-- https://mybatis.org/generator/reference/plugins.html -->
12+
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
13+
14+
<!-- 자동생성 주석 금지 -->
15+
<commentGenerator>
16+
<property name="suppressAllComments" value="true"/>
17+
<property name="useLegacyGeneratedAnnotation" value="false"/>
18+
</commentGenerator>
19+
20+
<jdbcConnection
21+
connectionURL="jdbc:oracle:thin:@localvmdb.oracle_xe_18c:1521:XE"
22+
driverClass="oracle.jdbc.OracleDriver"
23+
password="book_ex"
24+
userId="book_ex"
25+
/>
26+
27+
<!-- Java 도메인 모델 생성 -->
28+
<javaModelGenerator
29+
targetPackage="org.fp024.domain.generated"
30+
targetProject="src/main/java"> <!-- eclipse의 generator에서는 프로젝트 폴더명부터 시작해야하지만, Maven 플러그인으로 실행시는 src부터 시작한다. -->
31+
<property name="enableSubPackages" value="true"/>
32+
<property name="trimStrings" value="true"/>
33+
</javaModelGenerator>
34+
35+
<!-- 메퍼 인터페이스 (레파지토리 인터페이스 ) -->
36+
<javaClientGenerator
37+
targetPackage="org.fp024.mapper.generated"
38+
targetProject="src/main/java">
39+
<property name="enableSubPackages" value="true"/>
40+
</javaClientGenerator>
41+
42+
43+
<!-- 타켓 테이블 - 게시판 테이블 -->
44+
<table tableName="tbl_board" domainObjectName="BoardVO"
45+
mapperName="BoardMapper">
46+
47+
<!-- 키생성 컬럼과 쿼리를 정의한다. -->
48+
<!-- 시퀀스를 호출해서 값을 넣기 때문에, identity를 false로 둔다. MySQL AutoIncreatement였다면 true로 두고, sqlStatemen="MySql" 로 설정할 필요가 있다. -->
49+
<generatedKey column="bno" identity="false"
50+
sqlStatement="SELECT seq_board.nextval FROM DUAL"/>
51+
52+
<!-- Oracle에서 bno 컬럼을 NUMBER(10,0)으로 설정했는데, 일단은 BIGINT로 써본다. -->
53+
<columnOverride column="bno" property="bno" jdbcType='BIGINT' javaType='java.lang.Long'/>
54+
<columnOverride column="regdate" property="regdate" jdbcType='DATE'
55+
javaType='java.time.LocalDateTime'/>
56+
<columnOverride column="updatedate" property="updateDate" jdbcType='DATE'
57+
javaType='java.time.LocalDateTime'/>
58+
59+
<columnOverride column="updatedate" property="updateDate" jdbcType='DATE'
60+
javaType='java.time.LocalDateTime'/>
61+
<columnOverride column="replycnt" property="replyCount" jdbcType='BIGINT' javaType='int'/>
62+
63+
</table>
64+
65+
<!-- 타켓 테이블 - 댓글 테이블 -->
66+
<table tableName="tbl_reply" domainObjectName="ReplyVO"
67+
mapperName="ReplyMapper">
68+
<!-- 키생성 컬럼과 쿼리를 정의한다. -->
69+
<!-- 시퀀스를 호출해서 값을 넣기 때문에, identity를 false로 둔다. MySQL AutoIncreatement였다면 true로 두고, sqlStatemen="MySql" 로 설정할 필요가 있다. -->
70+
<generatedKey column="rno" identity="false"
71+
sqlStatement="SELECT seq_reply.nextval FROM DUAL"/>
72+
73+
<!-- Oracle에서 bno 컬럼을 NUMBER(10,0)으로 설정했는데, 일단은 BIGINT로 써본다. -->
74+
<columnOverride column="rno" property="rno" jdbcType='BIGINT' javaType='java.lang.Long'/>
75+
<columnOverride column="replydate" property="replyDate" jdbcType='DATE'
76+
javaType='java.time.LocalDateTime'/>
77+
<columnOverride column="updatedate" property="updateDate" jdbcType='DATE'
78+
javaType='java.time.LocalDateTime'/>
79+
</table>
80+
81+
82+
<!-- 타켓 테이블 - 첨부파일 정보 테이블 -->
83+
<table tableName="tbl_attach" domainObjectName="BoardAttachVO"
84+
mapperName="BoardAttachMapper">
85+
<columnOverride column="uploadpath" property="uploadPath"/>
86+
<columnOverride column="filename" property="fileName"/>
87+
<columnOverride column="filetype" property="fileType" jdbcType="CHAR"
88+
javaType="org.fp024.domain.FileType"
89+
typeHandler="org.fp024.typehandler.CustomEnumTypeHandler"/>
90+
<columnOverride column="bno" property="bno" jdbcType='BIGINT' javaType='java.lang.Long'/>
91+
</table>
92+
93+
<!--
94+
참고: 아래 내용은 jex06에서 먼저 실행한 내용 가져오기만하고 실제로 매퍼생성을 하진 않았다.
95+
자동생성을 하더라도 수정을 해야되서, jex06에서 만들고 수정했던 내용을 그대로 옮겨와서
96+
또 만들고 수정하진 않았음.
97+
-->
98+
<!--
99+
타켓 테이블 - 회원 테이블
100+
회원과 권한의 1:N 관계를 표현하는 List<AuthVO> 는 MyBatis Generator로 표현할 수 없기 때문에,
101+
그 부분은 자동생성 이후 수동으로 클래스 소스를 수정해야한다.
102+
-->
103+
<table tableName="TBL_MEMBER" domainObjectName="MemberVO"
104+
mapperName="MemberMapper">
105+
<columnOverride column="USERID" property="userId"/>
106+
<columnOverride column="USERPW" property="userPassword"/>
107+
<columnOverride column="USERNAME" property="userName"/>
108+
109+
<columnOverride column="REGDATE" property="registerDate" jdbcType='DATE'
110+
javaType='java.time.LocalDateTime'/>
111+
<columnOverride column="UPDATEDATE" property="updateDate" jdbcType='DATE'
112+
javaType='java.time.LocalDateTime'/>
113+
114+
<columnOverride column="ENABLED" property="enabled" jdbcType="CHAR"
115+
javaType="org.fp024.domain.EnabledType"
116+
typeHandler="org.fp024.typehandler.CustomEnumTypeHandler"/>
117+
</table>
118+
119+
<!--
120+
타켓 테이블 - 권한 테이블
121+
ex06 프로젝트에서는 회원테이블과 권한테이블을 JOIN해서 회원정보를 가져왔기 때문에,
122+
권한 테이블에 대해서는 별도로 Mapper를 만들지 않았다.
123+
124+
그리고 회원이나, 권한에 대한 Create, Update, Delete를 기능상으로 구현을 안해서 그렇기도 한데...
125+
여기선 자동생성되는 부분이니 일단 AuthMapper를 만들게 하자.
126+
-->
127+
<table tableName="TBL_MEMBER_AUTH" domainObjectName="AuthVO"
128+
mapperName="AuthMapper">
129+
<columnOverride column="USERID" property="userId"/>
130+
<columnOverride column="AUTH" property="auth" jdbcType="VARCHAR"
131+
javaType="org.fp024.domain.MemberAuthType"
132+
typeHandler="org.fp024.typehandler.CustomEnumTypeHandler"/>
133+
</table>
134+
135+
</context>
136+
</generatorConfiguration>
704 KB
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@ECHO OFF
2+
SETLOCAL
3+
ECHO [Jetty Run...]
4+
CALL ..\..\set-jdk-env.bat
5+
mvnw clean -Pjetty-run jetty:run
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# default value is "log"
2+
lombok.log.fieldName=LOGGER
3+
4+
# default value is "true"
5+
lombok.log.fieldIsStatic=true

0 commit comments

Comments
 (0)