사용자 관리

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));
    }
}

카테고리:

업데이트:

댓글남기기