사용자 관리
사용자 관리
Q1) 사용자 목록과 사용자 수를 함께 내리는 REST API를 작성해 보세요.
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
ResponseData의 구조를 아래와 같은 형식으로 작성해서 결과 리턴
{
"totalCount": N,
"data": user목록 컬렉션
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ResponseMessage {
private Long totalCount;
private List<Member> data;
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member")
public ResponseMessage memberList() {
List<Member> memberList = memberRepository.findAll();
Long totalMemberCount = memberRepository.count();
return ResponseMessage.builder()
.totalCount(totalMemberCount)
.data(memberList).build();
}
}
Q2) 사용자 상세 조회를 조회하는 API를 아래 조건에 맞게 구현해 보세요.
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
ResponseMessage 클래스로 추상화해서 전송
{
"header": {
result: true|false,
resultCode: String,
message: error message or alert message,
status: http result code
},
"body": 내려야 할 데이터가 있는 body를 통해서 전송
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ResponseMessage {
private ResponseMessageHeader header;
private Object data;
public static ResponseMessage fail(String message) {
return ResponseMessage.builder()
.header(ResponseMessageHeader.builder()
.result(false)
.resultCode("")
.message(message)
.status(HttpStatus.BAD_REQUEST.value())
.build())
.data(null).build();
}
public static ResponseMessage success(Object data) {
return ResponseMessage.builder()
.header(ResponseMessageHeader.builder()
.result(true)
.resultCode("")
.message("")
.status(HttpStatus.OK.value())
.build())
.data(data).build();
}
private Long totalCount;
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/{id}")
public ResponseEntity<?> memberDetail(@PathVariable Long id) {
Optional<Member> member = memberRepository.findById(id);
if(!member.isPresent()){
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다"), HttpStatus.BAD_REQUEST);
}
return ResponseEntity.ok().body(ResponseMessage.success(member));
}
}
Q3) 사용자 목록 조회에 대한 검색을 리턴하는 API를 작성해 보세요.
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
이메일, 이름, 전화번호에 대한 검색 결과를 리턴(각 항목은 or 조건)
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByEmailContainsOrPhoneContainsOrMemberNameContains(String email, String phone, String memberName);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MemberSearch {
private String email;
private String memberName;
private String phone;
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/search")
public ResponseEntity<?> findMember(@RequestBody MemberSearch memberSearch){
List<Member> memberList = memberRepository.findByEmailContainsOrPhoneContainsOrMemberNameContains(
memberSearch.getEmail(),
memberSearch.getPhone(),
memberSearch.getMemberName());
return ResponseEntity.ok().body(ResponseMessage.success(memberList));
}
}
Q4) 사용자의 상태를 변경하는 API를 작성해 보세요.
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
사용자 상태: (정상, 정지)
이에 대한 플래그 값은 사용자 상태(정상:Using, 정지:Stop)
@NoArgsConstructor
public enum MemberStatus {
None, Using, Stop;
int value;
public int getValue(){
return this.value;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MemberStatusInput {
MemberStatus status;
}
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String email;
@Column
private String memberName;
@Column
private String password;
@Column
private String phone;
@Column
private LocalDateTime regDate;
@Column
private LocalDateTime updateDate;
@Column
private MemberStatus status;
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@PatchMapping("/api/admin/member/{id}/status")
public ResponseEntity<?> memberStatus(@PathVariable Long id, @RequestBody MemberStatusInput memberStatusInput) {
Optional<Member> optionalMember = memberRepository.findById(id);
if (optionalMember.isEmpty()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다"),HttpStatus.BAD_REQUEST);
}
Member member = optionalMember.get();
member.setStatus(memberStatusInput.getStatus());
memberRepository.save(member);
return ResponseEntity.ok().build();
}
}
Q5) 사용자 정보를 삭제하는 API를 작성해 보세요.(작성된 게시글이 있으면 예외 발생 처리)
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
@Repository
public interface NoticeRepository extends JpaRepository<Notice, Long> {
Long countByMember(Member member);
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
private final NoticeRepository noticeRepository;
@DeleteMapping("/api/admin/member/{id}")
public ResponseEntity<?> deleteMember(@PathVariable Long id) {
Optional<Member> optionalMember = memberRepository.findById(id);
if (optionalMember.isEmpty()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다"), HttpStatus.BAD_REQUEST);
}
Member member = optionalMember.get();
if (noticeRepository.countByMember(member) > 0) {
return new ResponseEntity<>(ResponseMessage.fail("사용자가 작성한 공지사항이 있습니다."), HttpStatus.BAD_REQUEST);
}
memberRepository.delete(member);
return ResponseEntity.ok().build();
}
}
Q6) 사용자가 로그인을 했을때 접속 로그를 조회하는 API를 작성해 보세요.
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
접속이력 정보가 있다는 가정하에 API 작성
MemberLoginHistory Entity를 통해서 구현
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class MemberLoginHistory {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private Long memberId;
@Column
private String email;
@Column
private String memberName;
@Column
private LocalDateTime loginDate;
@Column
private String ipAddr;
}
@Repository
public interface MemberLoginHistoryRepository extends JpaRepository<MemberLoginHistory, Long> {
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
private final NoticeRepository noticeRepository;
private final MemberLoginHistoryRepository memberLoginHistoryRepository;
@GetMapping("/api/admin/member/login/history")
private ResponseEntity<?> memberLoginHistory() {
List<MemberLoginHistory> memberLoginHistories = memberLoginHistoryRepository.findAll();
return ResponseEntity.ok().body(memberLoginHistories);
}
}
Q7) 사용자의 접속을 제한하는 API를 구현해 보세요.
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
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String email;
@Column
private String memberName;
@Column
private String password;
@Column
private String phone;
@Column
private LocalDateTime regDate;
@Column
private LocalDateTime updateDate;
@Column
private MemberStatus status;
@Column
private boolean lockYn;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ResponseMessage {
private ResponseMessageHeader header;
private Object data;
public static ResponseMessage fail(String message) {
return ResponseMessage.builder()
.header(ResponseMessageHeader.builder()
.result(false)
.resultCode("")
.message(message)
.status(HttpStatus.BAD_REQUEST.value())
.build())
.data(null).build();
}
public static ResponseMessage success(Object data) {
return ResponseMessage.builder()
.header(ResponseMessageHeader.builder()
.result(true)
.resultCode("")
.message("")
.status(HttpStatus.OK.value())
.build())
.data(data).build();
}
public static ResponseMessage success() {
return ResponseMessage.builder()
.header(ResponseMessageHeader.builder()
.result(true)
.resultCode("")
.message("")
.status(HttpStatus.OK.value())
.build())
.data(null).build();
}
private Long totalCount;
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@PatchMapping("/api/admin/member/{id}/lock")
public ResponseEntity<?> memberLock(@PathVariable Long id) {
Optional<Member> optionalMember = memberRepository.findById(id);
if (optionalMember.isEmpty()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다"), HttpStatus.BAD_REQUEST);
}
Member member = optionalMember.get();
if(member.isLockYn()){
return new ResponseEntity<>(ResponseMessage.fail("이미 접속제한이 된 사용자 입니다."),HttpStatus.BAD_REQUEST);
}
member.setLockYn(true);
memberRepository.save(member);
return ResponseEntity.ok().body(ResponseMessage.success());
}
}
Q8) 사용자의 접속제한을 해제하는 API를 구현해 보세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@PatchMapping("/api/admin/member/{id}/unlock")
public ResponseEntity<?> memberUnLock(@PathVariable Long id) {
Optional<Member> optionalMember = memberRepository.findById(id);
if (optionalMember.isEmpty()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다"), HttpStatus.BAD_REQUEST);
}
Member member = optionalMember.get();
if(!member.isLockYn()){
return new ResponseEntity<>(ResponseMessage.fail("이미 접속제한이 해제된 사용자 입니다."),HttpStatus.BAD_REQUEST);
}
member.setLockYn(false);
memberRepository.save(member);
return ResponseEntity.ok().body(ResponseMessage.success());
}
}
Q9) 회원 전체수와 상태별 회원수에 대한 정보를 리턴하는 API를 작성해보세요.
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
서비스 클래스를 이용해서 작성
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MemberSummary {
private Long stopMemberCount;
private Long usingMemberCount;
private Long totalMemberCount;
}
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
Long countByStatus(MemberStatus memberStatus);
}
public interface MemberService {
MemberSummary getMemberStatusCount();
}
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Override
public MemberSummary getMemberStatusCount() {
Long usingMemberCount = memberRepository.countByStatus(MemberStatus.Using);
Long stopMemberCount = memberRepository.countByStatus(MemberStatus.Stop);
Long count = memberRepository.count();
return MemberSummary.builder()
.usingMemberCount(usingMemberCount)
.stopMemberCount(stopMemberCount)
.totalMemberCount(count)
.build();
}
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/status/count")
public ResponseEntity<?> memberStatueCount() {
MemberSummary memberSummary = memberService.getMemberStatusCount();
return ResponseEntity.ok().body(ResponseMessage.success(memberSummary));
}
}
Q10) 오늘의 사용자 가입 목록을 리턴하는 API를 작성해 보세요.
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
서비스를 이용해서 REST API를 작성해 보세요.
public interface MemberService {
List<Member> getTodayMembers();
}
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
}
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
int countByEmail(String email);
@Query("select m from Member m where m.regDate between :startDate and :endDate")
List<Member> findToday(LocalDateTime startDate, LocalDateTime endDate);
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/today")
public ResponseEntity<?> todayMember() {
List<Member> memberList = memberService.getTodayMembers();
return ResponseEntity.ok().body(ResponseMessage.success(memberList));
}
}
Q11) 사용자별 게시글 수를 리턴하는 API를 작성해 보세요.
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
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MemberNoticeCount {
private Long id;
private String email;
private String memberName;
private Long noticeCount;
}
@Repository
@RequiredArgsConstructor
public class MemberCustomRepository {
private final EntityManager entityManager;
public List<MemberNoticeCount> findMemberNoticeCount() {
String sql = "select m.id, m.email, m.member_name,(select count(*) from notice n where n.member_id = m.id) notice_count from member m";
return (List<MemberNoticeCount>) entityManager.createNativeQuery(sql).getResultList();
}
}
public interface MemberService {
List<MemberNoticeCount> getMemberNoticeCount();
}
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
private final MemberCustomRepository memberCustomRepository;
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/notice/count")
public ResponseEntity<?> memberNoticeCount() {
List<MemberNoticeCount> memberNoticeCountList = memberService.getMemberNoticeCount();
return ResponseEntity.ok().body(ResponseMessage.success(memberNoticeCountList));
}
}
Q12) 사용자별 게시글수와 좋아요수를 리턴하는 API를 작성해 보세요.
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
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MemberLogCount {
private Long id;
private String email;
private String memberName;
private Long noticeCount;
private Long noticeLikeCount;
}
public interface MemberService {
List<MemberLogCount> getMemberLogCount();
}
@Repository
@RequiredArgsConstructor
public class MemberCustomRepository {
private final EntityManager entityManager;
public List<MemberLogCount> findMemberLogCount() {
String sql = "select m.id, m.email, m.member_name," +
" (select count(*) from notice n where n.member_id = m.id) notice_count," +
" (select count(*) from notice_like nl where nl.member_id = m.id) notice_like_count" +
" from member m";
return (List<MemberLogCount>) entityManager.createNativeQuery(sql).getResultList();
}
}
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
private final MemberCustomRepository memberCustomRepository;
@Override
public List<MemberLogCount> getMemberLogCount() {
return memberCustomRepository.findMemberLogCount();
}
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/log/count")
public ResponseEntity<?> memberLogCount() {
List<MemberLogCount> memberLogCounts = memberService.getMemberLogCount();
return ResponseEntity.ok().body(ResponseMessage.success(memberLogCounts));
}
}
Q13) 좋아요를 가장 많이 한 사용자 목록 10개를 리턴하는 API를 작성해 보세요.
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
public interface MemberService {
List<MemberLogCount> getMemberLikeBest();
}
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
private final MemberCustomRepository memberCustomRepository;
@Override
public List<MemberLogCount> getMemberLikeBest() {
return memberCustomRepository.getMemberLikeBest();
}
}
@Repository
@RequiredArgsConstructor
public class MemberCustomRepository {
public List<MemberLogCount> getMemberLikeBest() {
String sql = "select t1.id, t1.email, t1.member_name, t1.notice_like_count from " +
" (select m.*, (select count(*) from notice_like nl where nl.member_id = m.id) as notice_like_count from member m ) t1 " +
" order by t1.notice_like_count desc ";
return (List<MemberLogCount>) entityManager.createNativeQuery(sql).getResultList();
}
}
@RestController
@RequiredArgsConstructor
public class ApiAdminController {
private final MemberRepository memberRepository;
@GetMapping("/api/admin/member/like/best")
public ResponseEntity<?> bestLikeCount() {
List<MemberLogCount> memberLogCounts = memberService.getMemberLikeBest();
return ResponseEntity.ok().body(ResponseMessage.success(memberLogCounts));
}
}
댓글남기기