Browse Source

feature: User모듈 - 테스트 코드추가

pull/8/head
lkd9125(이경도) 7 months ago
parent
commit
15e8930a74
  1. 69
      app/kac-app/src/docs/asciidoc/index.adoc
  2. 345
      app/kac-app/src/main/resources/static/docs/index.html
  3. 78
      app/kac-app/src/test/java/kr/co/palnet/kac/BaseTest.java
  4. 228
      app/kac-app/src/test/java/kr/co/palnet/kac/user/account/UserAccountControllerTest.java
  5. 5
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java
  6. 4
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java
  7. 11
      web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java
  8. 17
      web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/certificate/controller/UserCertificateController.java

69
app/kac-app/src/docs/asciidoc/index.adoc

@ -172,4 +172,73 @@ include::{snippets}/com/code/lang/delete/query-parameters.adoc[]
==== [HTTP RESPONSE INFO]
include::{snippets}/com/code/lang/delete/http-response.adoc[]
***
[[User-Account-API]]
== User-Account API
=== [User 회원가입]
==== [HTTP REQUEST INFO]
include::{snippets}/user/account/register/http-request.adoc[]
include::{snippets}/user/account/register/request-fields.adoc[]
==== [HTTP RESPONSE INFO]
include::{snippets}/user/account/register/http-response.adoc[]
***
=== [User 회원탈퇴]
==== [HTTP REQUEST INFO]
include::{snippets}/user/account/delete/http-request.adoc[]
include::{snippets}/user/account/delete/request-headers.adoc[]
==== [HTTP RESPONSE INFO]
include::{snippets}/user/account/delete/http-response.adoc[]
***
=== [User 회원정보 조회]
==== [HTTP REQUEST INFO]
include::{snippets}/user/account/profile/http-request.adoc[]
include::{snippets}/user/account/profile/request-headers.adoc[]
==== [HTTP RESPONSE INFO]
include::{snippets}/user/account/profile/http-response.adoc[]
include::{snippets}/user/account/profile/response-fields.adoc[]
***
=== [User 회원암호 변경]
==== [HTTP REQUEST INFO]
include::{snippets}/user/account/update/pswd/http-request.adoc[]
include::{snippets}/user/account/update/pswd/request-headers.adoc[]
include::{snippets}/user/account/update/pswd/request-fields.adoc[]
==== [HTTP RESPONSE INFO]
include::{snippets}/user/account/update/pswd/http-response.adoc[]
***
=== [User 회원정보 변경]
==== [HTTP REQUEST INFO]
include::{snippets}/user/account/update/http-request.adoc[]
include::{snippets}/user/account/update/request-headers.adoc[]
include::{snippets}/user/account/update/request-fields.adoc[]
==== [HTTP RESPONSE INFO]
include::{snippets}/user/account/update/http-response.adoc[]
***

345
app/kac-app/src/main/resources/static/docs/index.html

@ -464,6 +464,11 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<li><a href="#_code_언어_삭제">[Code 언어 삭제]</a></li>
</ul>
</li>
<li><a href="#User-Account-API">User-Account API</a>
<ul class="sectlevel2">
<li><a href="#_user_회원가입">[User 회원가입]</a></li>
</ul>
</li>
</ul>
</div>
</div>
@ -515,11 +520,20 @@ Host: localhost:8080</code></pre>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 143
[ {
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"siteCd" : "KAC",
"groupCdNm" : "신규그룹001",
"rm" : "비고....",
@ -626,7 +640,7 @@ Content-Length: 143
<h4 id="_http_request_info_2"><a class="link" href="#_http_request_info_2">[HTTP REQUEST INFO]</a></h4>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">GET /v1/com/code/code?groupCd=NEW_GROUP_1707924397&amp;langDivCd=ko_KR HTTP/1.1
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">GET /v1/com/code/code?groupCd=NEW_GROUP_1708411842&amp;langDivCd=ko_KR HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json
Host: localhost:8080</code></pre>
@ -664,11 +678,20 @@ Host: localhost:8080</code></pre>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 190
[ {
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"cdNm" : "신규코드001",
"upperCd" : null,
@ -759,11 +782,20 @@ Host: localhost:8080</code></pre>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 143
[ {
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"siteCd" : "KAC",
"groupCdNm" : "신규그룹001",
"rm" : "비고....",
@ -835,7 +867,7 @@ Content-Length: 118
Host: localhost:8080
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"siteCd" : "KAC",
"groupCdNm" : "신규그룹001",
"rm" : "비고...."
@ -890,18 +922,27 @@ Host: localhost:8080
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 276
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 275
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"siteCd" : "KAC",
"groupCdNm" : "신규그룹001",
"rm" : "비고....",
"createUserId" : "CREATE_USER",
"createDt" : "2024-02-15T00:26:37.902778",
"createDt" : "2024-02-20T15:50:43.127816",
"updateUserId" : "CREATE_USER",
"updateDt" : "2024-02-15T00:26:37.902782"
"updateDt" : "2024-02-20T15:50:43.12782"
}</code></pre>
</div>
</div>
@ -987,7 +1028,7 @@ Content-Length: 132
Host: localhost:8080
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"cdId" : "NEW_CODE001",
"sortOrdr" : 0,
"addInfoValue" : "추가!!",
@ -1049,20 +1090,29 @@ Host: localhost:8080
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 310
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"cdId" : "NEW_CODE001",
"upperCd" : null,
"sortOrdr" : 0,
"addInfoValue" : "추가!!",
"useYn" : "Y",
"createUserId" : "CREATE_USER",
"createDt" : "2024-02-15T00:26:37.887931",
"createDt" : "2024-02-20T15:50:43.107273",
"updateUserId" : "CREATE_USER",
"updateDt" : "2024-02-15T00:26:37.887936"
"updateDt" : "2024-02-20T15:50:43.107277"
}</code></pre>
</div>
</div>
@ -1160,7 +1210,7 @@ Content-Length: 144
Host: localhost:8080
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"langDivCd" : "ko_KR",
"cdNm" : "신규코드001",
@ -1222,19 +1272,28 @@ Host: localhost:8080
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 302
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"langDivCd" : "ko_KR",
"cdNm" : "신규코드001",
"rm" : "비고....",
"createUserId" : "CREATE_USER",
"createDt" : "2024-02-15T00:26:37.826757",
"createDt" : "2024-02-20T15:50:43.009038",
"updateUserId" : "CREATE_USER",
"updateDt" : "2024-02-15T00:26:37.826761"
"updateDt" : "2024-02-20T15:50:43.009043"
}</code></pre>
</div>
</div>
@ -1326,7 +1385,7 @@ Content-Length: 118
Host: localhost:8080
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"siteCd" : "KAC",
"groupCdNm" : "신규그룹001",
"rm" : "비고...."
@ -1381,18 +1440,27 @@ Host: localhost:8080
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 275
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 276
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411843",
"siteCd" : "KAC",
"groupCdNm" : "신규그룹001",
"rm" : "비고....",
"createUserId" : "CREATE_USER",
"createDt" : "2024-02-15T00:26:37.84228",
"createDt" : "2024-02-20T15:50:43.031642",
"updateUserId" : "UPDATE_USER",
"updateDt" : "2024-02-15T00:26:37.844978"
"updateDt" : "2024-02-20T15:50:43.035007"
}</code></pre>
</div>
</div>
@ -1478,7 +1546,7 @@ Content-Length: 132
Host: localhost:8080
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"sortOrdr" : 0,
"addInfoValue" : "수정!!",
@ -1540,20 +1608,29 @@ Host: localhost:8080
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 310
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"upperCd" : null,
"sortOrdr" : 0,
"addInfoValue" : "수정!!",
"useYn" : "Y",
"createUserId" : "CREATE_USER",
"createDt" : "2024-02-15T00:26:37.757743",
"createDt" : "2024-02-20T15:50:42.915944",
"updateUserId" : "UPDATE_USER",
"updateDt" : "2024-02-15T00:26:37.770459"
"updateDt" : "2024-02-20T15:50:42.938404"
}</code></pre>
</div>
</div>
@ -1651,7 +1728,7 @@ Content-Length: 143
Host: localhost:8080
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"langDivCd" : "ko_KR",
"cdNm" : "신규코드001",
@ -1713,19 +1790,28 @@ Host: localhost:8080
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 301
{
"groupCd" : "NEW_GROUP_1707924397",
"groupCd" : "NEW_GROUP_1708411842",
"cdId" : "NEW_CODE001",
"langDivCd" : "ko_KR",
"cdNm" : "신규코드001",
"rm" : "수정...",
"createUserId" : "CREATE_USER",
"createDt" : "2024-02-15T00:26:37.798977",
"createDt" : "2024-02-20T15:50:42.973527",
"updateUserId" : "UPDATE_USER",
"updateDt" : "2024-02-15T00:26:37.803818"
"updateDt" : "2024-02-20T15:50:42.978852"
}</code></pre>
</div>
</div>
@ -1842,7 +1928,16 @@ Host: localhost:8080</code></pre>
<h4 id="_http_response_info_10"><a class="link" href="#_http_response_info_10">[HTTP RESPONSE INFO]</a></h4>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK</code></pre>
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY</code></pre>
</div>
</div>
<hr>
@ -1891,7 +1986,16 @@ Host: localhost:8080</code></pre>
<h4 id="_http_response_info_11"><a class="link" href="#_http_response_info_11">[HTTP RESPONSE INFO]</a></h4>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK</code></pre>
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY</code></pre>
</div>
</div>
<hr>
@ -1945,8 +2049,181 @@ Host: localhost:8080</code></pre>
<h4 id="_http_response_info_12"><a class="link" href="#_http_response_info_12">[HTTP RESPONSE INFO]</a></h4>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK</code></pre>
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY</code></pre>
</div>
</div>
<hr>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="User-Account-API"><a class="link" href="#User-Account-API">User-Account API</a></h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_user_회원가입"><a class="link" href="#_user_회원가입">[User 회원가입]</a></h3>
<div class="sect3">
<h4 id="_http_request_info_13"><a class="link" href="#_http_request_info_13">[HTTP REQUEST INFO]</a></h4>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">POST /v1/user/account/register HTTP/1.1
Content-Type: application/json;charset=UTF-8
Accept: application/json
Content-Length: 337
Host: localhost:8080
{
"cstrmDivCd" : "MEMBER",
"cstrmStatusCd" : "ACTIVE",
"userId" : "TEST_1708411843171",
"authId" : "USER",
"siteCode" : "DRONE",
"userPswd" : "palnet!234",
"joinCrtfyCd" : "HP_CRTFD",
"memberName" : "이경도",
"brthdyDate" : "1999-09-07",
"email" : "lkd9125@naver.com",
"hpno" : "01083703435",
"clncd" : "+82"
}</code></pre>
</div>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">파라미터</th>
<th class="tableblock halign-left valign-top">타입</th>
<th class="tableblock halign-left valign-top">설명</th>
<th class="tableblock halign-left valign-top">필수</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cstrmDivCd</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">회원타입 코드</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cstrmStatusCd</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">회원 활성화 코드</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>userId</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">아이디</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>authId</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">권한 값</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>siteCode</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">사이트 코드</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>userPswd</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">암호</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>joinCrtfyCd</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">가입인증 분류 코드</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>memberName</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">이름</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>brthdyDate</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">생년월일</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>email</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">이메일</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>hpno</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">휴대폰 번호</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>clncd</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">휴대폰 국가번호</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>terms</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Array</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">동의 약관 리스트</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>terms[].termsSno</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Number</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">약관 식별번호</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>terms[].agreeYn</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">약관 동의여부</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect3">
<h4 id="_http_response_info_13"><a class="link" href="#_http_response_info_13">[HTTP RESPONSE INFO]</a></h4>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight nowrap"><code data-lang="http" class="language-http hljs">HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY</code></pre>
</div>
</div>
<div class="paragraph">
<p>Unresolved directive in index.adoc - include::./build/generated-snippets/user/account/register/response-fields.adoc[]</p>
</div>
<hr>
</div>
@ -1957,7 +2234,7 @@ Host: localhost:8080</code></pre>
<div id="footer">
<div id="footer-text">
Version 1.0.0<br>
Last updated 2024-02-07 14:39:05 +0900
Last updated 2024-02-20 15:50:06 +0900
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.6/styles/github.min.css">

78
app/kac-app/src/test/java/kr/co/palnet/kac/BaseTest.java

@ -1,18 +1,33 @@
package kr.co.palnet.kac;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletException;
import kr.co.palnet.kac.api.v1.user.account.model.detail.SearchUserRS;
import kr.co.palnet.kac.api.v1.user.account.model.register.FormRegisterRQ;
import kr.co.palnet.kac.api.v1.user.account.service.UserAccountService;
import kr.co.palnet.kac.app.KacAppApplication;
import kr.co.palnet.kac.config.security.model.BaseUserDetails;
import kr.co.palnet.kac.config.security.service.BaseUserDetailsService;
import kr.co.palnet.kac.config.security.util.JwtUtil;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockFilterConfig;
import org.springframework.restdocs.RestDocumentationContextProvider;
import org.springframework.restdocs.RestDocumentationExtension;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
import org.springframework.security.config.BeanIds;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.DelegatingFilterProxy;
import java.time.LocalDate;
import java.time.LocalDateTime;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
@ -24,12 +39,24 @@ public class BaseTest {
@Autowired
protected WebApplicationContext webApplicationContext;
@Autowired
protected UserAccountService userAccountService;
@Autowired
protected BaseUserDetailsService baseUserDetailsService;
public MockMvc mockMvc;
protected final String CREATE_PASSWORD = "palnet!234";
@BeforeEach
public void setUpAll(RestDocumentationContextProvider restDocumentationContextProvider){
public void setUpAll(RestDocumentationContextProvider restDocumentationContextProvider) throws ServletException {
DelegatingFilterProxy delegateProxyFilter = new DelegatingFilterProxy();
delegateProxyFilter.init(new MockFilterConfig(webApplicationContext.getServletContext(), BeanIds.SPRING_SECURITY_FILTER_CHAIN));
this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) // @Autowired로 빈주입 받은 context
.addFilter(new CharacterEncodingFilter("UTF-8", true)) // UTF-8 인코딩 필터
.addFilters(new CharacterEncodingFilter("UTF-8", true), delegateProxyFilter) // UTF-8 인코딩 필터, SecurityFilter
.apply(
MockMvcRestDocumentation.documentationConfiguration(restDocumentationContextProvider)
.operationPreprocessors()
@ -42,4 +69,51 @@ public class BaseTest {
)
.build();
}
protected String getUserToken(){
String username = "TEST_" + System.currentTimeMillis();
String jsonRQ = """
{
"cstrmDivCd" : "MEMBER",
"cstrmStatusCd" : "ACTIVE",
"userId" : "%s",
"authId" : "USER",
"siteCode" : "DRONE",
"userPswd" : "%s",
"joinCrtfyCd" : "HP_CRTFD",
"memberName" : "이경도",
"brthdyDate" : "1999-09-07",
"email" : "lkd9125@naver.com",
"hpno" : "01083703435",
"clncd" : "+82"
}
""".formatted(username, this.CREATE_PASSWORD);
FormRegisterRQ rq = new FormRegisterRQ();
rq.setCstrmDivCd("MEMBER");
rq.setCstrmStatusCd("ACTIVE");
rq.setUserId(username);
rq.setAuthId("USER");
rq.setSiteCode("DRONE");
rq.setUserPswd("palnet!234");
rq.setJoinCrtfyCd("HP_CRTFD");
rq.setMemberName("이경도");
rq.setBrthdyDate(LocalDate.of(1999, 9, 7));
rq.setEmail("lkd9125@naver.com");
rq.setHpno("01083703435");
rq.setClncd("+82");
try{
userAccountService.createUser(rq);
} catch (Exception e){
e.printStackTrace();
}
BaseUserDetails userDetails = (BaseUserDetails) baseUserDetailsService.loadUserByUsername(username);
return JwtUtil.makeAuthToken(userDetails);
}
}

228
app/kac-app/src/test/java/kr/co/palnet/kac/user/account/UserAccountControllerTest.java

@ -0,0 +1,228 @@
package kr.co.palnet.kac.user.account;
import kr.co.palnet.kac.BaseTest;
import kr.co.palnet.kac.api.v1.user.account.service.UserAccountService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.restdocs.headers.HeaderDocumentation;
import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders;
import org.springframework.restdocs.payload.JsonFieldType;
import org.springframework.transaction.annotation.Transactional;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
import static org.springframework.restdocs.payload.PayloadDocumentation.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class UserAccountControllerTest extends BaseTest {
@Autowired
private UserAccountService userAccountService;
private final String BASE_URL = "/v1/user/account";
private final String GRANT_TYPE = "Bearer";
@DisplayName("회원정보 변경")
@Test
@Transactional
public void updateUser() throws Exception{
String jsonRQ = """
{
"email" : "lkd9125@naver.com",
"hpno" : "01083703435"
}
""";
String token = this.getUserToken();
this.mockMvc.perform(
put(this.BASE_URL + "/update")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(jsonRQ)
.accept(MediaType.APPLICATION_JSON_VALUE)
.header("Authorization", GRANT_TYPE + " " + token)
)
.andDo(print())
.andDo(
document(
"user/account/update",
preprocessResponse(prettyPrint()),
HeaderDocumentation.requestHeaders(
HeaderDocumentation.headerWithName("Authorization").description("Access토큰 [로그인 발급]")
),
requestFields(
fieldWithPath("email").type(JsonFieldType.STRING).description("바꿀 이메일").optional(),
fieldWithPath("hpno").type(JsonFieldType.STRING).description("바꿀 전화번호").optional()
)
)
)
.andExpect(status().isOk());
}
@DisplayName("암호 변경")
@Test
@Transactional
public void updatePassword() throws Exception{
String jsonRQ = """
{
"userPswd" : "%s",
"newPswd" : "palnet!234",
"newPswdConfirm" : "palnet!234"
}
""".formatted(this.CREATE_PASSWORD);
String token = this.getUserToken();
this.mockMvc.perform(
put(this.BASE_URL + "/update/pswd")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(jsonRQ)
.accept(MediaType.APPLICATION_JSON_VALUE)
.header("Authorization", GRANT_TYPE + " " + token)
)
.andDo(print())
.andDo(
document(
"user/account/update/pswd",
preprocessResponse(prettyPrint()),
HeaderDocumentation.requestHeaders(
HeaderDocumentation.headerWithName("Authorization").description("Access토큰 [로그인 발급]")
),
requestFields(
fieldWithPath("userPswd").type(JsonFieldType.STRING).description("현재 암호").optional(),
fieldWithPath("newPswd").type(JsonFieldType.STRING).description("바뀔 암호"),
fieldWithPath("newPswdConfirm").type(JsonFieldType.STRING).description("바뀔 암호 확인")
)
)
)
.andExpect(status().isOk());
}
@DisplayName("회원정보 조회")
@Test
@Transactional
public void getUserInfo() throws Exception{
String token = this.getUserToken();
this.mockMvc.perform(
get(this.BASE_URL + "/profile")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON_VALUE)
.header("Authorization", GRANT_TYPE + " " + token)
)
.andDo(print())
.andDo(
document(
"user/account/profile", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
preprocessResponse(prettyPrint()),
HeaderDocumentation.requestHeaders(
HeaderDocumentation.headerWithName("Authorization").description("Access토큰 [로그인 발급]")
),
responseFields(
fieldWithPath("memberName").type(JsonFieldType.STRING).description("회원 이름"),
fieldWithPath("brthdyDate").type(JsonFieldType.STRING).description("생년월일"),
fieldWithPath("cntryCd").type(JsonFieldType.STRING).description("국적 구분코드"),
fieldWithPath("email").type(JsonFieldType.STRING).description("이메일"),
fieldWithPath("hpno").type(JsonFieldType.STRING).description("휴대폰 번호"),
fieldWithPath("userId").type(JsonFieldType.STRING).description("아이디"),
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시"),
fieldWithPath("updateuserId").type(JsonFieldType.STRING).description("수정자 아이디"),
fieldWithPath("cptAuthCode").type(JsonFieldType.STRING).description("각 항청 구분코드")
)
)
)
.andExpect(status().isOk());
}
@DisplayName("회원탈퇴")
@Test
@Transactional
public void deleteUser() throws Exception{
String token = this.getUserToken();
this.mockMvc.perform(
RestDocumentationRequestBuilders.delete(this.BASE_URL + "/delete")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON_VALUE)
.header("Authorization", GRANT_TYPE + " " + token)
)
.andDo(print())
.andDo(
document(
"user/account/delete", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
preprocessResponse(prettyPrint()),
HeaderDocumentation.requestHeaders(
HeaderDocumentation.headerWithName("Authorization").description("Access토큰 [로그인 발급]")
)
)
)
.andExpect(status().isOk());
}
@DisplayName("회원가입")
@Test
@Transactional
public void register() throws Exception{
String username = "TEST_" + System.currentTimeMillis();
String jsonRQ = """
{
"cstrmDivCd" : "MEMBER",
"cstrmStatusCd" : "ACTIVE",
"userId" : "%s",
"authId" : "USER",
"siteCode" : "DRONE",
"userPswd" : "palnet!234",
"joinCrtfyCd" : "HP_CRTFD",
"memberName" : "이경도",
"brthdyDate" : "1999-09-07",
"email" : "lkd9125@naver.com",
"hpno" : "01083703435",
"clncd" : "+82"
}
""".formatted(username);
this.mockMvc.perform(
post(this.BASE_URL + "/register")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(jsonRQ)
.accept(MediaType.APPLICATION_JSON_VALUE)
)
.andDo(print())
.andDo(
document(
"user/account/register", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
preprocessResponse(prettyPrint()),
requestFields(
fieldWithPath("cstrmDivCd").type(JsonFieldType.STRING).description("회원타입 코드"),
fieldWithPath("cstrmStatusCd").type(JsonFieldType.STRING).description("회원 활성화 코드"),
fieldWithPath("userId").type(JsonFieldType.STRING).description("아이디"),
fieldWithPath("authId").type(JsonFieldType.STRING).description("권한 값"),
fieldWithPath("siteCode").type(JsonFieldType.STRING).description("사이트 코드"),
fieldWithPath("userPswd").type(JsonFieldType.STRING).description("암호"),
fieldWithPath("joinCrtfyCd").type(JsonFieldType.STRING).description("가입인증 분류 코드"),
fieldWithPath("memberName").type(JsonFieldType.STRING).description("이름"),
fieldWithPath("brthdyDate").type(JsonFieldType.STRING).description("생년월일"),
fieldWithPath("email").type(JsonFieldType.STRING).description("이메일"),
fieldWithPath("hpno").type(JsonFieldType.STRING).description("휴대폰 번호"),
fieldWithPath("clncd").type(JsonFieldType.STRING).description("휴대폰 국가번호"),
fieldWithPath("terms").type(JsonFieldType.ARRAY).description("동의 약관 리스트").optional(),
fieldWithPath("terms[].termsSno").type(JsonFieldType.NUMBER).description("약관 식별번호"),
fieldWithPath("terms[].agreeYn").type(JsonFieldType.STRING).description("약관 동의여부")
)
)
)
.andExpect(status().isCreated());
}
}

5
data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java

@ -4,6 +4,7 @@ import jakarta.persistence.*;
import lombok.*;
import java.time.Instant;
import java.time.LocalDateTime;
@Data
@ -42,7 +43,7 @@ public class PtyCstmrGroup {
// 승인일자
@Column(name = "APRVL_DT", columnDefinition = "datetime(6)")
private Instant aprvlDt;
private LocalDateTime aprvlDt;
// 참여여부
@Column(name = "JOIN_YN", columnDefinition = "char(1) default 'N'", nullable = false)
@ -54,7 +55,7 @@ public class PtyCstmrGroup {
// 탈퇴일시
@Column(name = "WTHDRW_DT", columnDefinition = "datetime(6)")
private Instant wthdrwDt;
private LocalDateTime wthdrwDt;
// 터미널ID
@Column(name = "TRMNL_ID", length = 20)

4
data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java

@ -31,6 +31,10 @@ public class PtyCstmrDomainService {
public PtyCstmrBas savePtyCstmrBas(PtyCstmrBas entity) {
return ptyCstmrBasRepository.save(entity);
}
public Optional<PtyCstmrDtl> findPtyCstmrDtlById(Long cstmrSno){
return ptyCstmrDtlRepository.findById(cstmrSno);
}
public PtyCstmrDtl savePtyCstmrDtl(PtyCstmrDtl entity){
return ptyCstmrDtlRepository.save(entity);
}

11
web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java

@ -162,15 +162,17 @@ public class UserAccountService {
}
}
@Transactional
public SearchUserRS getUserInfo() {
Long cstmrSno = SessionHelper.getCstmrSno();
Optional<PtyCstmrBas> userEntityData = ptyCstmrDomainService.findPtyCstmrBasById(cstmrSno);
Optional<PtyCstmrDtl> userDetailEntityData = ptyCstmrDomainService.findPtyCstmrDtlById(cstmrSno);
if(userEntityData.isPresent()){
if(userEntityData.isPresent() && userDetailEntityData.isPresent()){
PtyCstmrBas userEntity = userEntityData.get();
PtyCstmrDtl userDetailEntity = userEntity.getPtyCstmrDtl();
PtyCstmrDtl userDetailEntity = userDetailEntityData.get();
SearchUserRS result = new SearchUserRS();
@ -227,10 +229,11 @@ public class UserAccountService {
String userId = SessionHelper.getUserId();
Optional<PtyCstmrBas> userEntityData = ptyCstmrDomainService.findPtyCstmrBasById(cstmrSno);
Optional<PtyCstmrDtl> userDetailEntityData = ptyCstmrDomainService.findPtyCstmrDtlById(cstmrSno);
if(userEntityData.isPresent()){
if(userEntityData.isPresent() && userDetailEntityData.isPresent()){
PtyCstmrBas userEntity = userEntityData.get();
PtyCstmrDtl userDetailEntity = userEntity.getPtyCstmrDtl();
PtyCstmrDtl userDetailEntity = userDetailEntityData.get();
userDetailEntity.setUpdateDt(LocalDateTime.now());
userDetailEntity.setUpdateUserId(userId);

17
web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/certificate/controller/UserCertificateController.java

@ -0,0 +1,17 @@
package kr.co.palnet.kac.api.v1.user.certificate.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping
@RestController
@Slf4j
@RequiredArgsConstructor
@Tag(name = "유저 - 인증", description = "유저 인증관련")
public class UserCertificateController {
}
Loading…
Cancel
Save