'Back-End/Spring'에 해당되는 글 102건

  1. 2024.10.01 스프링 강의 공부중 1. (springbatch jpa, txt, csv, fixed, json)
  2. 2020.12.22 토비의 스프링 1-1 (간단한 DAO 만들기)
  3. 2019.09.28 메뉴바에 디자인 넣어보기 (수정중)
  4. 2019.09.27 베스트게시물 게시판 (디자인 코드 추가, 내 프로젝트에 적용) 2
  5. 2019.09.26 베스트 게시물 관련 게시판 구현 (내 프로젝트에 적용)
  6. 2019.09.24 소셜 로그인 (네이버, 카카오톡, 페이스북) 후 프로필 확인 (내 프로젝트 적용)) 1
  7. 2019.09.23 프로필보기 기능 구현 (내 프로젝트에 적용)
  8. 2019.09.20 java에서 List형태로 저장한 값 출력 및 날짜형식 변환

스프링 강의 공부중 1. (springbatch jpa, txt, csv, fixed, json)

Back-End/Spring 2024. 10. 1. 12:18

00:00 스프링 배치

01:31 배치 개발 환경 구성

06:55 Tasklet 배치

27:36 DB Reader/Writer with JPA <-- 시청

51:17 Text File Reader/Writer

1:09:28 CSV Reader/Writer

1:32:35 Fixed Length Reader/Writer

1:37:36 Json Reader/Writer

 

 

 

 

출처 : https://youtu.be/wy99cPHlMlA?si=1NCgxIzH1LseFuCo

 

:

토비의 스프링 1-1 (간단한 DAO 만들기)

Back-End/Spring 2020. 12. 22. 05:00


사용자 정보를 JDBC API를 통해 DB에 저장하고 조회할 수 있는 DAO 만들기



 

 - DAO -


 DAO (Data Access Object) 는 DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다. 




User 클래스 만들기 (사용자 정보 - id, name, password를 저장한 클래스)



 

 package springbook.user.domain;


 public class User {

String id;

String name;

String password;


public String getId() {

return id;

}


public void setId(String id) {

this.id = id;

}


public String getName() {

return name;

}


public void setName(String name){

this.name = name;

}


public String getPassword() {

return password;

}


public void setPassword(String password) {

this.password = password;

}

  }




User 정보가 담길 테이블을 생성


 

  create table users (

id varchar(10) primary key,

name varchar(20) not null,

password varchar(10) not null

  )





 

  자바빈


 자바빈은 원래 비주얼 툴에서 조작 가능한 컴포넌트를 말합니다. 


 자바의 주력 개발 플랫폼이 웹 기반의 엔터프라이즈 방식으로 바뀌면서 비주얼 컴포넌트로서 자바빈은 인기를 잃어 갔지만,


 자바빈의 몇 가지 코딩 관례는 JSP 빈, EJB와 같은 표준 기술과 자바빈 스타일의 오브젝트를 사용하는 오픈소스 기술을 통해 계속 이어져 왔다.


 디폴트 생성자 : 자바빈은 파라미터가 없는 디폴트 생성자를 가지고 있어야 한다.


 프로퍼티 : 자바빈이 노출하는 이름을 가진 속성을 프로퍼티라고 한다. 프로퍼티는 set로 시작하는 수정자 메소드 (setter) 와 get로 시작하는

               get으로 시작하는 접근자 메소드 (getter) 를 이용해 수정 또는 조회할 수 있다.




JDBC를 이용하는 작업의 일반적인 순서. (DB 연결)


1. DB연결을 위한 Connection을 가져옵니다.


2. SQL을 담은 Statement를 만듭니다.


3. 만들어진 Statement를 실행합니다.


4. 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet로 받아서 정보를 저장할 오브젝트에 옮겨줍니다.


5. 작업중에 생성된 Connection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아줍니다.


6. JDBC API가 만들어내는 예외 (exception) 를 잡아서 직접 처리하거나, 메소드에 throws를 선언해서 예외가 발생하면 

메소드 밖으로 던지게 합니다.




-계속-

:

메뉴바에 디자인 넣어보기 (수정중)

Back-End/Spring 2019. 9. 28. 13:35

메뉴바에 디자인 넣어보는 중. 부트스트랩은 반응형웹에도 사용이 되기때문에 웹페이지의 크기에 따라 항목이 다르게 나온다.


(수정중)


menu.jsp


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- views/include/menu.jsp -->
<%@ include file="header.jsp"%>
<head>
<script
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet"
    href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script
    src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js%22"></script>
</head>
 
 
<center>
    <body>
        <nav class="navbar navbar-inverse">
            <div class="container-fluid">
                <div class="navbar-header">
                    <a class="navbar-brand" href="#">Hs-Project</a>
                </div>
 
                <div>
                    <!-- 다른 기능들 링크가 걸려있는 메뉴 페이지 -->
                    <ul class="nav navbar-nav">
                        <li class="active"><a href="${path}/home">Home</a>
                    </ul>
 
                    <li class="dropdown"><a class="dropdown-toggle"
                        data-toggle="dropdown" href="#">게시판<span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="${path}/board/list.do">회원 게시판</a></li>
                            <li><a href="${path}/board/best_list.do">베스트 게시물 게시판</a></li>
 
                        </ul></li>
                    <!-- 어떠한 아이디로든 로그인되지 않았을 경우에만 회원가입 링크를 출력시킨다. -->
                    <c:if
                        test="${sessionScope.user_id == null and sessionScope.navername == null and sessionScope.kakaonickname == null and sessionScope.facebookname == null and sessionScope.admin_id == null}">
 
                        <li><a href="${path}/member/email.do">회원가입</a></li>
 
                    </c:if>
 
 
 
                    <!-- 관리자가 로그인 하지 않았을 경우에만 로그인 링크를 출력시킴 -->
                    <c:if
                        test="${sessionScope.user_id == null and sessionScope.navername == null and sessionScope.kakaonickname == null and sessionScope.facebookname == null and sessionScope.admin_id == null}">
                        <li><a href="${path}/admin/admin_login_view.do">관리자 로그인</a></li>
                    </c:if>
 
 
                    <li><a href="${path}/board/admin_board_list.do">공지사항</a></li>
 
 
                    <c:if test="${sessionScope.admin_id != null}">
 
                        <li class="dropdown"><a class="dropdown-toggle"
                            data-toggle="dropdown" href="#">관리자 메뉴<span class="caret"></span></a>
                            <ul class="dropdown-menu">
                                <li><a
                                    href="${path}/admin/admin_member_forced_eviction_view.do">회원
                                        강제 탈퇴</a></li>
                                <li><a href="${path}/admin/admin_member_info.do">회원 정보</a></li>
                            </ul></li>
                    </c:if>
                </div>
            </div>
        </nav>
 
    </body>
    
</center>
 
</html>
cs







출처

http://blog.naver.com/PostView.nhn?blogId=aroma104&logNo=220461569593&parentCategoryNo=&categoryNo=34&viewDate=&isShowPopularPosts=true&from=search

:

베스트게시물 게시판 (디자인 코드 추가, 내 프로젝트에 적용)

Back-End/Spring 2019. 9. 27. 15:25

조회수가 50이 넘는 게시물은 제목 옆에 hit 애니메이션이 출력되도록 하고,


추천수 상위 3개의 글은 1위,2위,3위 애니메이션이 출력되도록 설정, 나머지 4위~10위 까지는 이달의 추천글 애니메이션이 출력되도록 함.


그리고 마우스 커서를 올리면 게시글의 색상이 변하도록 구현함




bestboard.jsp 


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp"%>
<%@ include file="../include/menu.jsp"%>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
 


디자인 관련 (css 관련 코드들)

<link rel = "stylesheet" href = "/css/bootstrap.css">
 
  <style>
    #container {
      width: 70%;
      margin: 0 auto;     /* 가로로 중앙에 배치 */
      padding-top: 10%;   /* 테두리와 내용 사이의 패딩 여백 */
    }
     
    #list {
      text-align: center;
    }
   
    #write {
      text-align: right;
    }
     
    /* Bootstrap 수정 */
    .table > thead {
      background-color: #b3c6ff;
    }
    .table > thead > tr > th {
      text-align: center;
    }
    .table-hover > tbody > tr:hover {
      background-color: #e6ecff;
    }
    .table > tbody > tr > td {
      text-align: center;
    }
    .table > tbody > tr > #title {
      text-align: left;
    }
     
    div > #paging {
      text-align: center;
    }
     
    .hit {
      animation-name: blink;
      animation-duration: 1.5s;
      animation-timing-function: ease;
      animation-iteration-count: infinite;
      /* 위 속성들을 한 줄로 표기하기 */
      /* -webkit-animation: blink 1.5s ease infinite; */
    }
     
    /* 애니메이션 지점 설정하기 */
    /* 익스플로러 10 이상, 최신 모던 브라우저에서 지원 */
    @keyframes blink {
      from {color: white;}
      30% {color: yellow;}
      to {color: red; font-weight: bold;}
      /* 0% {color:white;}
      30% {color: yellow;}
      100% {color:red; font-weight: bold;} */
    }
  </style>
 
 


 <script>
//게시판 목록 페이지로 이동하게 하는 함수
function list(page){
    console.log("페이지를 이동합니다.");
    location.href="list.do?curPage="+page;
};
 
</script>
<%@ include file="../include/login.jsp"%><br>
    
 
 
<center>
<div id = "list">
<b>베스트 게시물 게시판</b>
</div>
 
<div>
<!-- 해당 table 클래스는 마우스를 올려놓았을때 게시글의 색깔이 파란색으로 변하도록 하는 클래스 -->
<table class="table table-striped table table-hover">
<center>
<thead>
    <tr>
    <!-- width옆에 %는 테이블에서 차지할 비율을 나타낸것 -->
        <th width="20%"><span style="color: green; font-weight: bold;">추천수 순위</span></th>
        <th width="10%">게시글 번호</th>
        <th width="15%">제목</th>
        <th width="15%">작성자</th>
        <th width="15%">내용</th>
        <th width="15%">날짜</th>
        <th width="5%">조회수</th>
        <th width="5%">추천수</th>
    </tr>
    </thead>
    <tbody>
        
    <!-- forEach var = "개별데이터" items = "집합데이터" -->
    <c:forEach var = "row" items = "${map.list}" varStatus="status"<!-- 컨트롤러에서 map안에 list를 넣었기 때문에 이렇게 받는다. -->
    <tr>
    
        <td>
        <center>
        <!-- hit를 사용해서 추천수 상위 1~3위 까지는 순위 애니메이션이 출력되도록 함 -->
        <c:if test="${row.rk <= 3 }">
            <span class = "hit" size = "7">${row.rk}위!!</span>
        </c:if>
        
        
        <!-- hit를 사용해서 추천수 상위 1~3위 까지는 이달의 추천글 애니메이션이 출력되도록 함 -->
        <c:if test="${row.rk >= 4 }">
            <span class = "hit" size = "4">이달의 추천글!!</span>
        </c:if>
        
        </font>
        </center>
        </td>    <!-- 게시글 순위 -->
        
        
        <td><center>${row.member_bno}</center></td>    <!-- 글번호 -->
        <!-- 클릭하면 컨트롤러의 view.do로 이동하고, 게시물번호, 페이지 번호, 검색옵션, 키워드를 같이 넘긴다 -->
        
        <!-- 조회수가 50이 넘는 글은 제목옆에 hit라는 애니메이션이 출력되도록 함 -->
    <td id ="title">
        <a href="best_board_view.do?member_bno=${row.member_bno}">${row.title}</a>
        <c:if test="${row.viewcnt >= 50 }">
            <span class = "hit">hit!!</span>
        </c:if>
</td>
 
        <td>${row.user_id}</td>    <!-- 작성자의 이름 -->
        <td>${row.content}</td>    <!-- 글의내용 -->
        <td>${row.reg_date}</td>    <!-- 날짜의 출력형식을 변경함 -->
        <td><center>${row.viewcnt}</center></td>    <!-- 조회수 -->
        <td><center>${row.recommend}</center></td>    <!-- 추천수 -->
 
 
    
    </tr>
    </c:forEach>
    </tbody>
 
</table>
</div>
 
<form name="form1" method="post" action="list.do">
    <select name="search_option">
        <option value="user_id"
<c:if test="${map.search_option == 'user_id'}">selected</c:if>
        >작성자</option>
        <option value="title" 
<c:if test="${map.search_option == 'title'}">selected</c:if>
        >제목</option>
        <option value="content" 
<c:if test="${map.search_option == 'content'}">selected</c:if>
        >내용</option>
        <option value="all" 
<c:if test="${map.search_option == 'all'}">selected</c:if>
        >작성자+내용+제목</option>
    </select>
    <input name="keyword" value="${map.keyword}">
    <input type="submit" value="조회">
   
</form>
 
 
 
 
</center>
<br><br><%@ include file="../include/Botton.jsp"%>
</body>
</html>
cs








:

베스트 게시물 관련 게시판 구현 (내 프로젝트에 적용)

Back-End/Spring 2019. 9. 26. 17:34

회원 게시판에 있는 게시글 중에 추천수 상위 10개의 글만 '베스트 게시물 게시판' 으로 옮겨서 출력하기.


만약 추천수가 동일하다면 조회수 순으로 순위를 매기도록 구현함.




menu.jsp (메뉴 출력 view)


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
32
33
34
35
36
37
38
39
40
41
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <!-- views/include/menu.jsp -->
 <%@ include file="header.jsp"%>
 
<center>
 
<!-- 다른 기능들 링크가 걸려있는 메뉴 페이지 -->
 
ㅣ  <a href="${path}/home">메인페이지</a> ㅣ
 
<!-- 어떠한 아이디로든 로그인되지 않았을 경우에만 회원가입 링크를 출력시킨다. -->
 
<c:if test = "${sessionScope.user_id == null and sessionScope.navername == null and sessionScope.kakaonickname == null and sessionScope.facebookname == null and sessionScope.admin_id == null}">
 
<a href="${path}/member/email.do">회원가입</a> ㅣ
 
</c:if>
 
<a href="${path}/board/list.do">회원 게시판</a> ㅣ
 
<a href="${path}/board/best_list.do">베스트 게시물 게시판</a> ㅣ
 
<!-- 관리자가 로그인 하지 않았을 경우에만 로그인 링크를 출력시킴 -->
<c:if test = "${sessionScope.user_id == null and sessionScope.navername == null and sessionScope.kakaonickname == null and sessionScope.facebookname == null and sessionScope.admin_id == null}">
<a href="${path}/admin/admin_login_view.do">관리자 로그인</a> ㅣ    
</c:if>
 
 
<a href="${path}/board/admin_board_list.do">공지사항</a> ㅣ
<br>
<br>
 
<c:if test = "${sessionScope.admin_id != null}">
관리자 메뉴 : ㅣ <a href="${path}/admin/admin_member_forced_eviction_view.do">회원 강제 탈퇴</a> ㅣ    
<a href = "${path}/admin/admin_member_info.do">회원 정보</a> ㅣ
</c:if>
 
</center>
 
 
cs




bestboard.jsp (베스트 게시글 목록 페이지)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp"%>
<%@ include file="../include/menu.jsp"%>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
 
<script>
//게시판 목록 페이지로 이동하게 하는 함수
function list(page){
    console.log("페이지를 이동합니다.");
    location.href="list.do?curPage="+page;
};
 
</script>
 
 
 
<%@ include file="../include/login.jsp"%><br>
    
 
 
<center>
<h2>베스트 게시물 게시판</h2>
<table border = "1" width = "800px" align = "top">
<center>
    <tr>
        
        <th>추천수 순위</th>
        <th>회원 게시글 번호</th>
        <th>제목</th>
        <th>작성자</th>
        <th>내용</th>
        <th>날짜</th>
        <th>조회수</th>
        <th>추천수</th>
 
        
    <!-- forEach var = "개별데이터" items = "집합데이터" -->
    <c:forEach var = "row" items = "${map.list}"<!-- 컨트롤러에서 map안에 list를 넣었기 때문에 이렇게 받는다. -->
    <tr>
        <td>${row.rk}</td>    <!-- 게시글 순위 -->
        <td>${row.member_bno}</td>    <!-- 글번호 -->
        <!-- 클릭하면 컨트롤러의 view.do로 이동하고, 게시물번호, 페이지 번호, 검색옵션, 키워드를 같이 넘긴다 -->
        <td>
        <a href="best_board_view.do?member_bno=${row.member_bno}">${row.title}</a>
<c:if test="${row.rcnt > 0}"
   <span style="color:red;">( ${row.rcnt} )</span
</c:if>  
</td>
 
        <td>${row.user_id}</td>    <!-- 작성자의 이름 -->
        <td>${row.content}</td>    <!-- 글의내용 -->
        <td>${row.reg_date}</td>    <!-- 날짜의 출력형식을 변경함 -->
        <td>${row.viewcnt}</td>    <!-- 조회수 -->
        <td>${row.recommend}</td>    <!-- 추천수 -->
 
 
    
    </tr>
    </c:forEach>
    
 
</table>
 
 
<form name="form1" method="post" action="list.do">
    <select name="search_option">
        <option value="user_id"
<c:if test="${map.search_option == 'user_id'}">selected</c:if>
        >작성자</option>
        <option value="title" 
<c:if test="${map.search_option == 'title'}">selected</c:if>
        >제목</option>
        <option value="content" 
<c:if test="${map.search_option == 'content'}">selected</c:if>
        >내용</option>
        <option value="all" 
<c:if test="${map.search_option == 'all'}">selected</c:if>
        >작성자+내용+제목</option>
    </select>
    <input name="keyword" value="${map.keyword}">
    <input type="submit" value="조회">
   
</form>
 
 
 
 
</center>
<br><br><%@ include file="../include/Botton.jsp"%>
</body>
</html>
cs




bestboardview.jsp (베스트 게시글 상세보기 페이지)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%@ include file="../include/header.jsp" %>
<%@ include file="../include/menu.jsp" %>
<script src="${path}/include/js/common.js"></script>
<script src="${path}/ckeditor/ckeditor.js"></script>
 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(function(){
    
    //목록 버튼
    $("#btnList").click(function(){
        location.href="best_list.do";
    });
 
    
//추천하기 버튼
$("#btnRecommend").click(function(){
    if(confirm("해당 글을 추천하시겠습니까?")){
        document.form1.action="recommend.do";
        document.form1.submit();
        
        alert("해당 글을 추천하였습니다.")
        
        }
    });
 
    
    
});
 
 
 
</script>
 
<h2>베스트 게시물 보기</h2>
<!-- 게시물을 작성하기 위해 컨트롤러의 insert.do로 맵핑 -->
<form id="form1" name="form1" method="post" action="${path}/board/insert.do">
<input type = "hidden" id = "member_bno" name = "member_bno" value = "${dto.member_bno }">
    <div>제목 <input name="title" id="title" size="80"
                    value="${dto.title}"
                    placeholder="제목을 입력하세요"><br><br>
<!-- placeholder은 제목을 입력할 수 있도록 도움말을 출력함 -->
    </div>
    <div>조회수 : ${dto.viewcnt}    </div><br><br>
    <div style="width:800px;">
        <textarea id="content" name="content"
rows="3" cols="80" 
placeholder="내용을 입력하세요">${dto.content}</textarea></div><br><br>
</form>
 
 
 
<!-- 마찬가지로 내용을 입력하도록 도움말을 출력함 -->
<script>
// ckeditor 적용
//id가 content인 태그 (글의 내용을 입력하는 태그)를 ck에디터를 적용한다는 의미
CKEDITOR.replace("content",{
    height: "300px"
});
 
CKEDITOR.replace("r_content",{
    height: "300px"
});
</script>
 
<div style = "width:700px; text-align:center;">
<!-- 수정, 삭제에 필요한 글번호를 hidden 태그에 저장한다. -->
    <input type = "hidden" name = "member_bno" value = "${dto.member_bno }">
    
 
    <!-- 관리자에게는 삭제 버튼을 표시한다. -->
    <c:if test = "${sessionScope.admin_id != null}">
            <button type = "button" id = "btnDelete">삭제</button>
    </c:if>
    
    
    <!-- 로그인이 되어있고, 본인 글이 아닐경우에만 추천할 수 있도록 버튼을 출력 -->
    <c:if test = "${sessionScope.user_id != null and sessionScope.user_id != dto.user_id
    or sessionScope.navername != null and sessionScope.navername != dto.user_id
    or sessionScope.kakaonickname != null and sessionScope.kakaonickname != dto.user_id
    or sessionScope.facebookname != null and sessionScope.facebookname != dto.user_id}">
            <button type = "button" id = "btnRecommend">추천하기</button>
    
    </c:if>
    
    <!-- 관리자에게도 추천 버튼 출력 -->
    <!-- 관리자에게는 삭제 버튼을 표시한다. -->
    <c:if test = "${sessionScope.admin_id != null}">
            <button type = "button" id = "btnRecommend">추천하기</button>
    </c:if>
    
    
    <!-- 글목록은 본인이 아니어도 확인 가능하게 한다. -->
    <button type = "button" id = "btnList">목록</button><br><br>
    
<body>
<br><br><%@ include file="../include/Botton.jsp"%>
</body>
</html>
cs




MemberBoardController.java (게시판 컨트롤러 중 일부)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.example.hansub_project.controller.board;
 
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.hansub_project.Member_Pager;
import com.example.hansub_project.controller.member.MemberController;
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
import com.example.hansub_project.model.board.dto.MemberBoardReplyDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
import com.example.hansub_project.service.board.MemberBoardService;
import com.example.hansub_project.service.member.MemberService;
 
 
@Controller    //게시판 관련 컨트롤러를 선언함
public class MemberBoardController {
    
    @Inject        //서비스를 호출하기위해서 의존성을 주입함
    MemberBoardService memberboardservice;
    
    @Inject        
    MemberService memberservice;
    
    //로깅을 위한 변수
        private static final Logger logger=
        LoggerFactory.getLogger(MemberBoardController.class);
    
 
    
    //베스트 게시판 게시글 출력
    @RequestMapping("/board/best_list.do")    //세부적인 url mapping
    public ModelAndView best_list(//RequestParam으로 옵션, 키워드, 페이지의 기본값을 각각 설정해준다.
            )
             throws Exception{
        
        List<MemberBoardDTO> list = memberboardservice.bestlistAll();
        
        ModelAndView mav = new ModelAndView();
        Map<String,Object> map = new HashMap<>();    //넘길 데이터가 많기 때문에 해쉬맵에 저장한 후에 modelandview로 값을 넣고 페이지를 지정
        
        map.put("list", list);                         //map에 list(게시글 목록)을 list라는 이름의 변수로 자료를 저장함.
    
        mav.addObject("map", map);                    //modelandview에 map를 저장
        
        mav.setViewName("board/bestboard");                //자료를 넘길 뷰의 이름
        
        return mav;    //게시판 페이지로 이동
    
        
    }
    
    
    
    //베스트 게시판 게시물 세부 내용 확인
    @RequestMapping(value = "/board/best_board_view", method= {RequestMethod.GET, RequestMethod.POST})
    public ModelAndView best_board_view(@RequestParam int member_bno, HttpSession session) throws Exception{
        
        //조회수 증가 쿼리
        memberboardservice.increaseViewcnt(member_bno, session);
        
        ModelAndView mav = new ModelAndView();
        mav.setViewName("board/bestboardview");
        
        //view로 자료를 넘기기위해서 mav에 값들을 저장해서 view.jsp로 리턴시킨다.
        mav.addObject("dto", memberboardservice.read(member_bno)); //상세보기를 한번 클릭하면 조회수를 1증가시킨다.
        
        return mav;     //view로 넘어가서 출력이 된다.
    }
    
    
}
 
cs




MemberBoardServiceImpl.java (게시판 서비스 구현 클래스 중 일부)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.example.hansub_project.service.board;
 
import java.util.List;
import java.util.Map;
 
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Service;
 
import com.example.hansub_project.model.board.dao.MemberBoardDAO;
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
 
@Service    //서비스 빈으로 설정함
public class MemberBoardServiceImpl implements MemberBoardService {
    
    @Inject    //dao를 호출하기 때문에 의존성을 주입한다.
    MemberBoardDAO memberboarddao;
 
    @Override
    public void create(MemberBoardDTO dto) throws Exception {
        memberboarddao.create(dto);
        //dto를 매개값으로 dao를 호출한다.
    }
 
    //게시물 읽기
    @Override
    public MemberBoardDTO read(int member_bno) throws Exception {
        return memberboarddao.read(member_bno);
    }
 
    //게시글 수정
    @Override
    public void update(MemberBoardDTO dto) throws Exception {
        memberboarddao.update(dto);
        
    }
    
    //게시물 삭제 관련 메소드
    @Override
    public void delete(int member_bno) throws Exception {
        memberboarddao.delete(member_bno);
        
    }
 
    @Override
    public List<MemberBoardDTO> listAll(String search_option, String keyword,int start, int end) throws Exception {
 
        return memberboarddao.listAll(search_option, keyword, start, end);
    }
 
    
    //조회수를 증가하게하는 쿼리
    //조회수 처리를 할때 일정 시간이 지난후 다시 클릭할때만 조회수가 증가하도록 설정
    @Override
    public void increaseViewcnt(int member_bno, HttpSession session) throws Exception {
        long update_time = 0//null을 방지하기 위해 초기값을 null로 설정함
        if(session.getAttribute("update_time_"+member_bno)!=null) {
            
            //최근에 조회수를 올린 시간이 null이 아니면
            update_time = (long)session.getAttribute("update_time_"+member_bno);
        }
        
        long current_time = System.currentTimeMillis();
        
        //일정 시간이 경과한 후에 조회수를 증가시킨다.
        if(current_time - update_time > 5 * 1000) {
            
        //조회수가 1증가했을때로부터 5000초 후에 다시 클릭을 해야 조회수가 다시 1 증가한다는 말이다.
        //조회수 증가 처리
            memberboarddao.increateViewcnt(member_bno);
            
            //조회수를 올린 시간을 저장함
            session.setAttribute("update_time_"+member_bno, current_time);
            
        }
        
    }
 
    @Override
    public int countArticle(String search_option, String keyword) throws Exception {
        return memberboarddao.countArticle(search_option,keyword); 
    }
 
    //게시글 추천관련 메소드 구현
    @Override
    public void recommend(int member_bno) throws Exception {
         
        memberboarddao.recommend(member_bno);
        
        }
    
    //베스트 게시판 게시글 목록 출력
    @Override
    public List<MemberBoardDTO> bestlistAll() throws Exception {
        
        return memberboarddao.bestlistAll();
        
        }
    }
 
 
 
cs




MemberBoardDAOImpl.java (게시판 DAO 중 일부)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.example.hansub_project.model.board.dao;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
import com.example.hansub_project.model.member.dao.MemberDAO;
 
 
@Repository        //dao 선언
public class MemberBoardDAOImpl implements MemberBoardDAO {
 
    @Inject    //db에 접속하기 위해 의존관계를 주입
    SqlSession sqlSession; 
    
    
    //게시글 쓰기
    @Override
    public void create(MemberBoardDTO dto) throws Exception {
        sqlSession.insert("memberboard.insert",dto);
        
    }
 
    //게시글 수정 
    @Override
    public void update(MemberBoardDTO dto) throws Exception {
        sqlSession.update("memberboard.update", dto);
        
    }
 
    //게시물 삭제 관련
    @Override
    public void delete(int member_bno) throws Exception {
        sqlSession.delete("memberboard.deleteArticle", member_bno); //mapper로 게시글 번호를 넘긴다.
        
    }
    
    //게시물 목록을 리턴
    @Override
    public List<MemberBoardDTO> listAll(String search_option, String keyword, int start, int end) throws Exception {
        
        Map<String,Object> map = new HashMap<>();
          map.put("search_option", search_option);
          map.put("keyword", keyword);
          map.put("start", start); //맵에 자료 저장
          map.put("end", end);
        
        //매개변수는 시작 레코드의 번호, 끝 번호, 옵션과 키워드가 들어간다.
        return sqlSession.selectList("memberboard.listAll", map);
    }
    
    //조회수 증가처리를 하는 메소드
    @Override
    public void increateViewcnt(int member_bno) throws Exception {
        
        sqlSession.update("memberboard.increaseViewcnt", member_bno);
    }
 
    @Override
    public int countArticle(String search_option, String keyword) throws Exception {
 
        Map<String,String> map=new HashMap<>();
        map.put("search_option", search_option);
        map.put("keyword""%"+keyword+"%");
        return sqlSession.selectOne("memberboard.countArticle",map);
    }
 
    //게시글 상세정보 
    @Override
    public MemberBoardDTO read(int member_bno) throws Exception {
        
        return sqlSession.selectOne("memberboard.read", member_bno);
    }
 
    //추천수 증가처리 메소드
    @Override
    public void recommend(int member_bno) throws Exception {
        
        sqlSession.update("memberboard.recommend", member_bno);
    }
 
    
    //베스트 게시글 게시판 게시글 목록 출력
    @Override
    public List<MemberBoardDTO> bestlistAll() throws Exception {
        
            return sqlSession.selectList("bestboard.bestlistAll");
        }
    
}    
    
cs




bestboardMapper.xml (베스트 게시판 관련 게시글 목록 출력 Mapper)


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
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
 
<mapper namespace="bestboard">
    
<!-- 베스트게시물 게시판에 출력되는 목록 mapper -->

<!-- 순위를 출력할때 먼저 추천수 기준으로 순위를 매기고 추천수가 동일한 경우에는
조회수를 기준으로 순위를 다시 매겨서 중복이 없도록 출력한다. -->

<select id="bestlistAll" resultType="com.example.hansub_project.model.board.dto.MemberBoardDTO">
 
select member_bno, 
user_id, 
reg_date, 
viewcnt, 
title, 
rcnt, 
content, 
recommend,
row_number() over (order by recommend desc, viewcnt desc) as rk
from 
    (
    select recommend, member_bno, user_id, reg_date, viewcnt, title, rcnt, content
    from member_board
    order by recommend desc
)
<![CDATA[where rownum <= 10]]>
        
</select>
 
 
 
</mapper>
 
cs











:

소셜 로그인 (네이버, 카카오톡, 페이스북) 후 프로필 확인 (내 프로젝트 적용))

Back-End/Spring 2019. 9. 24. 17:04

일반 로그인을 했을때 처럼 소셜 로그인을 한 후에 프로필을 확인할 수 있도록 구현.


카카오톡은 api 규정 때문에 id를 받을 수가 없어서 닉네임을 대신 받아옴.



login_form.jsp (로그인 관련 폼)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="576736845363-o0474pib5q69qlcv6lm7o42hs6lu5u59.apps.googleusercontent.com">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name = "viewport" content = "user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,
width=device-width" />
 
<title>Insert title here</title>
 
</head>
<br><br><%@ include file="../include/header.jsp"%>
 
<table border="1" width="300">
 
<tr>
<td>
<br>
<center>
<span style="color:green; font-weight : bold;">회원 로그인</span>
</center>
 
 
<!-- 로그인창 -->
<form action ="normale_login.do" method = "post">
<center>
<br>
아이디 : <input type = "text" name="user_id" placeholder="  ID를 입력하세요 "><br><br>
비밀번호 : <input type = "password" name="member_pass" placeholder="  비밀번호를 입력하세요 "><br><br>
<button type = "submit" name = "submit" >로그인</button>
 
<br>
<br>
<div class = "row">
    <div class="col-xs-8">
        <div class="checkbox icheck">
        <label>
            <input type = "checkbox" name = "useCookie"> 로그인유지
        </label>
        </div>
    </div>
</div>
</center>
 
<center>
 
<html lang="ko">
<head>
<script type="text/javascript" src="https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.0.js" charset="utf-8"></script>
</head>
<body>
<br>
<!-- 네이버아이디로로그인 버튼 노출 영역 -->
<div id="naverIdLogin"></div>
<!-- //네이버 아이디로 로그인 버튼 노출 영역 -->
 
<!-- 네이버 아이디로 로그인 초기화 Script -->
<script type="text/javascript">
    var naverLogin = new naver.LoginWithNaverId(
        {
            //클라이언트 id와 콜백 url (결과페이지)
            clientId: "DphfmDygX4WFkf8nghMJ",
            callbackUrl: "http://localhost/hansub_project/login_result",
            isPopup: false/* 팝업을 통한 연동처리 여부 */
            loginButton: {color: "green", type: 3, height: 40/* 로그인 버튼의 타입을 지정 */
        }
    );
    
    /* 설정정보를 초기화하고 연동을 준비 */
    naverLogin.init();
    
</script>
</center>
 
 
</center>
 
<center>
<!-- 카카오톡 아이디 연동해서 로그인 -->
<script src = "//developers.kakao.com/sdk/js/kakao.min.js"></script>
<a id="kakao-login-btn"></a>
<a href="http://developers.kakao.com/logout"></a>
<script type='text/javascript'>
 
Kakao.init('bd21082a499aaa79b4c08e01935a8a70'); //아까 카카오개발자홈페이지에서 발급받은 자바스크립트 키를 입력함
 
//카카오 로그인 버튼을 생성합니다. 
 
Kakao.Auth.createLoginButton({ 
    container: '#kakao-login-btn'
    success: function(authObj) { 
           Kakao.API.request({
 
               url: '/v1/user/me',
 
               success: function(res) {
 
                     console.log(res.id);//<---- 콘솔 로그에 id 정보 출력(id는 res안에 있기 때문에  res.id 로 불러온다)
 
                     console.log(res.kaccount_email);//<---- 콘솔 로그에 email 정보 출력 (어딨는지 알겠죠?)
 
                     console.log(res.properties['nickname']);//<---- 콘솔 로그에 닉네임 출력(properties에 있는 nickname 접근 
                             
                 // res.properties.nickname으로도 접근 가능 )
                     console.log(authObj.access_token);//<---- 콘솔 로그에 토큰값 출력
          
          var id = res.id;    //카카오톡 닉네임을 변수에 저장
          var kakaonickname = res.properties.nickname;    //카카오톡 닉네임을 변수에 저장
          var kakaoe_mail = res.kaccount_email;    //카카오톡 이메일을 변수에 저장함
         
          
 
          window.location.replace("http://" + window.location.hostname + ( (location.port==""||location.port==undefined)?"":":" + location.port) + "/hansub_project/home?kakaonickname="+kakaonickname+"kakaotalk"+"&kakaoe_mail="+kakaoe_mail);
      
                   }
                 })
               },
               fail: function(error) {
                 alert(JSON.stringify(error));
               }
             });
</script>
</center>
 
 
<!-- 페이스북 아이디를 연동해서 로그인 -->
 
 <center>
<button type"button" id"loginBtn" ><img src="C:/img/facelogin.png"/>페이스북 로그인</button>
 </center>
 
            <div id="access_token"></div>
            <div id="user_id"></div>
            <div id="name"></div>
            <div id="email"></div>
            <div id="gender"></div>
            <div id="birthday"></div>
            <div id="id"></div>            
            
<script>
function getUserData() {
    /* FB.api('/me', function(response) {
        document.getElementById('response').innerHTML = 'Hello ' + response.name;
        console.log(response);
    }); */
    FB.api('/me', {fields: 'name,email'}, function(response) {
        
        var facebookname = response.name;    //페이스북 아이디를 변수에 저장함
        var facebooke_mail = response.email;    //페이스북 이메일을 변수에 저장함
        
        
        window.location.replace("http://" + window.location.hostname + ( (location.port==""||location.port==undefined)?"":":" + location.port) + "/hansub_project/home?facebookname="+encodeURI(facebookname)+"&facebooke_mail="+facebooke_mail);
 
    });
}
  
window.fbAsyncInit = function() {
    //SDK loaded, initialize it
    FB.init({
        appId      : '488986078336253'//페이스북 개발자 홈페이지에서 앱을 등록하고, 앱 id를 받아온다.
        cookie     : true,  // enable cookies to allow the server to access
                // the session
        xfbml      : true,  // parse social plugins on this page
        version    : 'v3.3'     // 페이스북 개발자 홈페이지에서 버전을 확인한 후 작성한다.
    });
  
    //check user session and refresh it
    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {        //만약 정상적으로 실행되었다면 유저의 데이터를 가져온다.
            //user is authorized
            //document.getElementById('loginBtn').style.display = 'none';
            getUserData(); 
            
        
            
        } else {
            //user is not authorized
        }
    });
};
  
//load the JavaScript SDK
(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.com/ko_KR/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document'script''facebook-jssdk'));
  
//add event listener to login button
document.getElementById('loginBtn').addEventListener('click'function() {
    //do the login
    FB.login(function(response) {
        if (response.authResponse) {
            access_token = response.authResponse.accessToken; //get access token
            user_id = response.authResponse.userID; //get FB UID
            console.log('access_token = '+access_token);
            console.log('user_id = '+user_id);
            //user just authorized your app
            //document.getElementById('loginBtn').style.display = 'none';
            getUserData();
        }
    }, {scope: 'email,public_profile,user_birthday',
        return_scopes: true});
}, false);
 
 
 
</script>
 
 
 
</form>
 
<br>
<!-- 아이디 찾기 -->
<form action ="find.user_id.do">
<center>
<button>아이디 찾기</button>
</center>
</form>
 
<br>
<!-- 비밀번호 찾기 -->
<form action ="find.member_pass.do">
<center>
<button>비밀번호찾기</button>
</center>
</form>
<br>
 
</td>
</tr>
</table>
 
 
<body>
<!-- 로그인 실패나 성공시 메시지를 받아서 출력하는 자바스크립트 구문 -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(function(){
        var responseMessage = "<c:out value="${message}" />";
        if (responseMessage != ""){
            alert(responseMessage)
        }
    })
</script>
 
 
</body>
</html>
cs




login.jsp (소셜 로그인 별로 프로필을 확인하는 각기 다른 메소드로 맵핑하게 만듦)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<c:if test = "${sessionScope.navername != null}">
 
(네이버)${sessionScope.navername}님이 로그인 하셨습니다.<br><br>
 
<form action = "naver_logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
<form action = "authentication.do" method = "post">
<button type = "submit" name = "submit">회원 인증하기 (인증을 해야 각종 기능들 사용 가능)</button></form><br><br>
 
<form action = "naver_member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
 
 
<c:if test = "${sessionScope.kakaonickname != null}">
 
(카카오톡)${sessionScope.kakaonickname}님이 로그인 하셨습니다.<br><br>
 
<form action = "kakao_logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
<form action = "authentication.do" method = "post">
<button type = "submit" name = "submit">회원 인증하기 (인증을 해야 각종 기능들 사용 가능)</button></form><br><br>
 
<form action = "kakao_member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
 
 
 
<c:if test = "${sessionScope.facebookname != null}">
 
(페이스북)${sessionScope.facebookname}님이 로그인 하셨습니다.<br><br>
 
<form action = "facebook_logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
 
<form action = "authentication.do" method = "post">
<button type = "submit" name = "submit">회원 인증하기 (인증을 해야 각종 기능들 사용 가능)</button></form><br><br>
 
<form action = "facebook_member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
cs



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
32
33
<c:if test = "${sessionScope.user_id == null and sessionScope.navername == null and sessionScope.kakaonickname == null and sessionScope.facebookname == null and sessionScope.admin_id == null}">
 
<%

//url로 보낸 아이디를 세션에 저장하기 위해 변수에 저장함
String navername = request.getParameter("navername");
String kakaonickname = request.getParameter("kakaonickname");
String facebookname = request.getParameter("facebookname");
String normalname = request.getParameter("user_id");
String admin_id = request.getParameter("admin_id");
 
 
//url로 보낸 이메일를 세션에 저장하기 위해 변수에 저장함
String navere_mail = request.getParameter("navere_mail");
String kakaoe_mail = request.getParameter("kakaoe_mail");
String facebooke_mail = request.getParameter("facebooke_mail");
 
%>    
 
 
<%
//아이디를 세션에 저장
session.setAttribute("navername", navername);
session.setAttribute("kakaonickname", kakaonickname);
session.setAttribute("facebookname", facebookname);
session.setAttribute("normalname", normalname);
session.setAttribute("admin_id", admin_id);
 
 
//이메일을 세션에 저장
session.setAttribute("navere_mail", navere_mail);
session.setAttribute("kakaoe_mail", kakaoe_mail);
session.setAttribute("facebooke_mail", facebooke_mail);
 
cs










MemberController.java 중 일부 (각 소셜 로그인 별로 메소드를 만들어서 session에 있는 아이디 값을 넘겨서 회원 자료를 검색하게 함)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
      //회원의 아이디로 회원 프로필을 출력하는 메소드 (네이버)
        @RequestMapping(value = "naver_member_profile.do")
        public ModelAndView naver_member_profile(HttpSession session, Date join_date, MemberDTO dto) throws Exception{
            
            
            //세션에 저장되어 있는 회원의 아이디를 변수에 저장함
            String user_id =(String)session.getAttribute("navername");
            
            //데이터베이스에서 검색한 값들을 DTO타입에 LIST에 저장한다.
            java.util.List<MemberDTO> list = memberservice.member_profile(user_id);
            
            Map<String,Object> map = new HashMap<>();
            
            //map에 리스트를 저장해서 출력할 view로 이동시킨다.
            
            //list가 null이면 회원정보가 없는것이므로 경고창을 출력하도록 함
            
            ModelAndView mv = new ModelAndView();
            
            //if문에서 list null처리를 할때에는 isEmpty()를 사용해서 null체크후 처리를 해주어야 한다.
            //list안에 값이 들어있을때 실행되는 구문
                
                //join_date의 형식을 바꾸어야 하기 때문에 join_date만 따로 빼서 형식을 변경한 후에 따로 넘긴다.
                for (int i = 0; i<list.size(); i++) {
                    
                    join_date = list.get(i).getJoin_date();
                    
                }
                
                String re_join_date = new SimpleDateFormat("yyyy-MM-dd").format(join_date);
                
                map.put("re_join_date", re_join_date);
                
                map.put("list", list);
                
                mv.addObject("map",map);
                
                mv.setViewName("member/member_profile");
                
 
            return mv;
        }
        
        
            //회원의 아이디로 회원 프로필을 출력하는 메소드 (카카오톡)
            @RequestMapping(value = "kakao_member_profile.do")
            public ModelAndView kakao_member_profile(HttpSession session, Date join_date, MemberDTO dto) throws Exception{
                    
                    
                //세션에 저장되어 있는 회원의 아이디를 변수에 저장함
                String user_id =(String)session.getAttribute("kakaonickname");
                    
                //데이터베이스에서 검색한 값들을 DTO타입에 LIST에 저장한다.
                java.util.List<MemberDTO> list = memberservice.member_profile(user_id);
                    
                Map<String,Object> map = new HashMap<>();
                    
                //map에 리스트를 저장해서 출력할 view로 이동시킨다.
                    
                //list가 null이면 회원정보가 없는것이므로 경고창을 출력하도록 함
                    
                ModelAndView mv = new ModelAndView();
                    
                    //if문에서 list null처리를 할때에는 isEmpty()를 사용해서 null체크후 처리를 해주어야 한다.
                    //list안에 값이 들어있을때 실행되는 구문
                        
                        //join_date의 형식을 바꾸어야 하기 때문에 join_date만 따로 빼서 형식을 변경한 후에 따로 넘긴다.
                        for (int i = 0; i<list.size(); i++) {
                            
                            join_date = list.get(i).getJoin_date();
                            
                        }
                        
                        String re_join_date = new SimpleDateFormat("yyyy-MM-dd").format(join_date);
                        
                        map.put("re_join_date", re_join_date);
                        
                        map.put("list", list);
                        
                        mv.addObject("map",map);
                        
                        mv.setViewName("member/member_profile");
                        
 
                    return mv;
                }
            
            
            //회원의 아이디로 회원 프로필을 출력하는 메소드 (페이스북)
            @RequestMapping(value = "facebook_member_profile.do")
            public ModelAndView facebook_member_profile(HttpSession session, Date join_date, MemberDTO dto) throws Exception{
                    
                    
                //세션에 저장되어 있는 회원의 아이디를 변수에 저장함
                String user_id =(String)session.getAttribute("facebookname");
                    
                //데이터베이스에서 검색한 값들을 DTO타입에 LIST에 저장한다.
                java.util.List<MemberDTO> list = memberservice.member_profile(user_id);
                    
                Map<String,Object> map = new HashMap<>();
                    
                //map에 리스트를 저장해서 출력할 view로 이동시킨다.
                    
                //list가 null이면 회원정보가 없는것이므로 경고창을 출력하도록 함
                    
                ModelAndView mv = new ModelAndView();
                    
                    //if문에서 list null처리를 할때에는 isEmpty()를 사용해서 null체크후 처리를 해주어야 한다.
                    //list안에 값이 들어있을때 실행되는 구문
                        
                        //join_date의 형식을 바꾸어야 하기 때문에 join_date만 따로 빼서 형식을 변경한 후에 따로 넘긴다.
                        for (int i = 0; i<list.size(); i++) {
                            
                            join_date = list.get(i).getJoin_date();
                            
                        }
                        
                        String re_join_date = new SimpleDateFormat("yyyy-MM-dd").format(join_date);
                        
                        map.put("re_join_date", re_join_date);
                        
                        map.put("list", list);
                        
                        mv.addObject("map",map);
                        
                        mv.setViewName("member/member_profile");
                        
 
                    return mv;
                }
        
cs




Service, DAO, Mapper, 프로필 출력하는 view 부분은 일반 로그인해서 프로필을 확인하는 부분과 동일하므로 생략함 (앞 글에 있음)





:

프로필보기 기능 구현 (내 프로젝트에 적용)

Back-End/Spring 2019. 9. 23. 13:57

로그인을 한 후에 "나의 프로필 확인" 버튼을 누르면 회원가입할때 작성한 나의 정보들이 표시되는 페이지로 이동해서


나의 프로필 정보가 출력된다.



로그인 페이지에 "나의 프로필 확인" 버튼을 추가함.


login.jsp


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%@ include file="header.jsp"%>
 
 
<body>
<br>
<!-- 세션에 id값이 저장되어 있는 경우 로그아웃 버튼과 로그인한 아이디가 출력되도록 코드를 작성함 -->
 
<c:if test = "${sessionScope.user_id != null}">
 
(일반)${sessionScope.user_id}님이 로그인 하셨습니다. <br><br>
 
<form action = "logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
<form action = "member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
 
</c:if>
 
 
<c:if test = "${sessionScope.navername != null}">
 
(네이버)${sessionScope.navername}님이 로그인 하셨습니다.<br><br>
 
<form action = "naver_logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
<form action = "authentication.do" method = "post">
<button type = "submit" name = "submit">회원 인증하기 (인증을 해야 각종 기능들 사용 가능)</button></form><br><br>
 
<form action = "member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
 
 
<c:if test = "${sessionScope.kakaonickname != null}">
 
(카카오톡)${sessionScope.kakaonickname}님이 로그인 하셨습니다.<br><br>
 
<form action = "kakao_logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
<form action = "authentication.do" method = "post">
<button type = "submit" name = "submit">회원 인증하기 (인증을 해야 각종 기능들 사용 가능)</button></form><br><br>
 
<form action = "member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
 
 
 
<c:if test = "${sessionScope.facebookname != null}">
 
(페이스북)${sessionScope.facebookname}님이 로그인 하셨습니다.<br><br>
 
<form action = "facebook_logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
 
<form action = "authentication.do" method = "post">
<button type = "submit" name = "submit">회원 인증하기 (인증을 해야 각종 기능들 사용 가능)</button></form><br><br>
 
<form action = "member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
 
 
<c:if test = "${sessionScope.admin_id != null}">
 
(관리자)${sessionScope.admin_id}님이 로그인 하셨습니다.<br><br>
 
<form action = "logout.do" method = "post">
<button type = "submit" name = "submit">로그아웃</button></form><br><br>
 
<form action = "member_profile.do" method = "post">
<button type = "submit" name = "submit">나의 프로필 확인</button></form><br><br>
 
</c:if>
 
 
 
 
<c:if test = "${sessionScope.user_id == null and sessionScope.navername == null and sessionScope.kakaonickname == null and sessionScope.facebookname == null and sessionScope.admin_id == null}">
 
<%
//url로 보낸 아이디를 세션에 저장하기 위해 변수에 저장함
String navername = request.getParameter("navername");
String kakaonickname = request.getParameter("kakaonickname");
String facebookname = request.getParameter("facebookname");
String normalname = request.getParameter("user_id");
String admin_id = request.getParameter("admin_id");
 
 
//url로 보낸 이메일를 세션에 저장하기 위해 변수에 저장함
String navere_mail = request.getParameter("navername");
String kakaoe_mail = request.getParameter("kakaonickname");
String facebooke_mail = request.getParameter("facebookname");
 
%>    
 
 
<%
//아이디를 세션에 저장
session.setAttribute("navername", navername);
session.setAttribute("kakaonickname", kakaonickname);
session.setAttribute("facebookname", facebookname);
session.setAttribute("normalname", normalname);
session.setAttribute("admin_id", admin_id);
 
 
//이메일을 세션에 저장
session.setAttribute("navere_mail", navere_mail);
session.setAttribute("kakaoe_mail", kakaoe_mail);
session.setAttribute("facebooke_mail", facebooke_mail);
 
 
if (navername == null && kakaonickname == null && facebookname == null && normalname == null && admin_id == null) {
    
%>
 
(guest)님 방문을 환영합니다.     <br>
                                <br>
                                
로그인을 하셔야 다른 기능을 정상적으로 이용하실 수 있습니다. <br>
        
    <%@ include file="../member/login_form.jsp"%><br>
    
<%
 
    } 
 
%>
    
    
    </c:if>
 
</body>
</html>
cs



버튼을 누르면 컨트롤러로 맵핑된다.


MemberController.java 중 일부


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
32
33
34
35
36
37
38
39
40
41
42
43
    
//회원아이디로 해당 회원의 정보를 검색하는 메소드

        @RequestMapping(value = "member_profile.do")
        public ModelAndView member_profile(HttpSession session, Date join_date, MemberDTO dto) throws Exception{
            
            //세션에 저장되어 있는 회원의 아이디를 변수에 저장함
            String user_id =(String)session.getAttribute("user_id");
            
            //데이터베이스에서 검색한 값들을 DTO타입에 LIST에 저장한다.
            java.util.List<MemberDTO> list = memberservice.member_profile(user_id);
            
            Map<String,Object> map = new HashMap<>();
            
            //map에 리스트를 저장해서 출력할 view로 이동시킨다.
                 
            ModelAndView mv = new ModelAndView();
            
            //if문에서 list null처리를 할때에는 isEmpty()를 사용해서 null체크후 처리를 해주어야 한다.
            //list안에 값이 들어있을때 실행되는 구문
            if(!list.isEmpty()) {
                
                //join_date의 형식을 바꾸어야 하기 때문에 join_date만 따로 빼서 형식을 변경한 후에 따로 넘긴다.
                for (int i = 0; i<list.size(); i++) {
                    
                    join_date = list.get(i).getJoin_date();
                    
                }
                
                String re_join_date = new SimpleDateFormat("yyyy-MM-dd").format(join_date);
                
                map.put("re_join_date", re_join_date);
                
                map.put("list", list);
                
                mv.addObject("map",map);
                
                mv.setViewName("member/member_profile");
                
            }
            
            return mv;
        }
 cs




MemberServiceImpl.java 중 일부


1
2
3
4
5
6
//자신의 프로필을 볼 수 있게 하는 메소드
    @Override
    public List<MemberDTO> member_profile(String user_id) throws Exception{
        
        return memberdao.member_profile(user_id);
    }
cs




MemberDAOImpl.java 중 일부


1
2
3
4
5
6
7
    
    //회원의 프로필 정보를 리턴한다.
    @Override
    public List<MemberDTO> member_profile(String user_id) throws Exception {
        
        return sqlSession.selectList("member.member_profile", user_id);
    }
cs



memberMapper.xml 중 일부


1
2
3
4
5
6
7
    <!-- 회원 프로필 확인 mapper -->
 
    <select id = "member_profile" resultType="com.example.hansub_project.model.member.dto.MemberDTO">
    select user_id, e_mail, join_date
    from member
    where user_id=#{user_id}
    </select>
cs



데이터베이스에서 검색한 회원의 프로필 정보가 넘어가서 출력되는 페이지


member_profile.jsp 


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="com.thoughtworks.qdox.parser.ParseException"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
 
</head>
<%@ include file="../include/header.jsp"%>
<%@ include file="../include/menu.jsp"%><br>
<body>
 
        <center>
        <br>
        <br>
        <br>
 
 
<c:if test = "${map.list != null}">
 
 
<center>
 
<span style="color: green; font-weight: bold;">나의 프로필</span> <br> <br>
 
<table border="1" width="300" height="250">
    
        <div style="text-align:center;">
            <tr>        
                <td>
                    
                    <center>
                        <div>    
    <c:forEach var = "member" items = "${map.list}"><!-- 컨트롤러에서 넘어온 map의 값 --> 
    
                            아이디 : ${member.user_id} <br><br>
                            
                            이메일 : ${member.e_mail} <br><br>
                            
                            가입날짜 : ${map.re_join_date} <br><br>
                            
                        </div>                        
                        
                        
                    </center>
                        
                    </td>
                </tr>
                </div>
                </c:forEach>
            </table>
            </center>
 
</c:if>
 
 
 
<br><br><%@ include file="../include/Botton.jsp"%>
</body>
</html>
cs





:

java에서 List형태로 저장한 값 출력 및 날짜형식 변환

Back-End/Spring 2019. 9. 20. 15:31

java에서 list형태에 저장한 DB의 값을 꺼내보기.


저장한 값중에 일부만 꺼내고 싶다면 아래처럼 for문을 사용해서 출력하면 됩니다.


그리고 출력한 후에 날짜 형식을 변환하려면 아래 처럼 SimpleDateFormat 타입 을 사용해서 날짜 형식을 변환시키면 된다.



-예시-


 

  String re_join_date = new SimpleDateFormat("yyyy-MM-dd").format(join_date);




-관련 예제-


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48


//회원아이디로 해당 회원의 정보를 검색하는 메소드

    @RequestMapping(value = "/admin/find_member.do")
    public ModelAndView find_member_info(String user_id, MemberDTO dto, Date join_date) throws Exception{
        
        //데이터베이스에서 검색한 값들을 DTO타입에 LIST에 저장한다.
        java.util.List<MemberDTO> list = adminservice.find_member_info(user_id);     //넘길 데이터가 많기 때문에        
        
        Map<String,Object> map = new HashMap<>();
        
        
        //map에 리스트를 저장해서 출력할 view로 이동시킨다.
        
        //list가 null이면 회원정보가 없는것이므로 경고창을 출력하도록 함
        
        ModelAndView mv = new ModelAndView();
        

  //if문에서 list null처리를 할때에는 isEmpty()를 사용해서 null체크후 처리를 해주어야 한다.

        //list안에 값이 들어있을때 실행되는 구문

        if(!list.isEmpty()) {
            
            //join_date의 형식을 바꾸어야 하기 때문에 join_date만 따로 빼서 형식을 변경한 후에 따로 넘긴다.

            for (int i = 0; i<list.size(); i++) {
                
                join_date = list.get(i).getJoin_date();
                
            }
            

//날짜형식을 yyyy-mm-dd 형식으로 변경한 후에 String 타입의 변수에 저장해서 view에 넘겨준다.

            String re_join_date = new SimpleDateFormat("yyyy-MM-dd").format(join_date);
            
            map.put("re_join_date", re_join_date);
            
            map.put("list", list);
            
            mv.addObject("map",map);
            
            mv.setViewName("admin/member_info");
            
        }else {
            
            mv.addObject("message""회원정보가 없는 회원입니다.");
            
            mv.setViewName("admin/member_info");
        }
        
        
        
        return mv;
    }
       
cs




출처

https://m.blog.naver.com/PostView.nhn?blogId=roseiriss&logNo=220088938355&categoryNo=36&proxyReferer=https%3A%2F%2Fwww.google.com%2F

: