Skip to content

Commit 5fcad63

Browse files
authored
Merge pull request #17 from f-lab-edu/feature/15
Feature/15: 회원 관리 기능 DB와 연동
2 parents 40579d6 + 96a5e1e commit 5fcad63

18 files changed

+126
-974
lines changed

app/src/main/java/org/example/domain/global/config/WebMvcConfig.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99
@Configuration
1010
@Profile("!test")
1111
public class WebMvcConfig implements WebMvcConfigurer {
12-
12+
/*
1313
@Override
1414
public void addInterceptors(InterceptorRegistry registry) {
1515
registry.addInterceptor(new LoginCheckInterceptor())
1616
.order(1)
1717
.addPathPatterns("/**")
18-
.excludePathPatterns("/profile/add", "/login", "/logout");
18+
.excludePathPatterns(
19+
"/profile/add",
20+
"/login", "/logout");
1921
}
22+
23+
*/
2024
}
Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,48 @@
11
package org.example.domain.member;
22

33
import jakarta.validation.Valid;
4-
import org.example.domain.member.dto.MemberEditForm;
5-
import org.example.domain.member.dto.MemberForm;
4+
import lombok.RequiredArgsConstructor;
5+
import org.example.domain.member.dto.request.MemberEditForm;
6+
import org.example.domain.member.dto.request.MemberJoinForm;
7+
import org.example.domain.member.dto.response.MemberDTO;
68
import org.example.domain.member.entity.Member;
7-
import org.springframework.beans.factory.annotation.Autowired;
89
import org.springframework.http.ResponseEntity;
910
import org.springframework.web.bind.annotation.*;
1011

11-
import java.net.URI;
12-
1312
@RestController
1413
@RequestMapping("/profile")
14+
@RequiredArgsConstructor
1515
public class MemberController {
1616
private final MemberService memberService;
1717

18-
@Autowired
19-
public MemberController(MemberService memberService) {
20-
this.memberService = memberService;
21-
}
22-
23-
// 회원가입
18+
x
2419
@PostMapping("/add")
25-
public ResponseEntity<Member> memberAdd(@Valid @RequestBody MemberForm memberForm) {
20+
public ResponseEntity<MemberDTO> memberAdd(@Valid @RequestBody MemberJoinForm memberForm) {
2621
Member savedMember = memberService.addMember(memberForm);
27-
return ResponseEntity.status(201).body(savedMember);
22+
MemberDTO memberDTO = MemberDTO.createMemberDTO(savedMember);
23+
return ResponseEntity.status(201).body(memberDTO);
2824
}
2925

3026
// 사용자 프로필 조회
3127
@GetMapping("/{user_id}")
32-
public ResponseEntity<Member> memberDetails(@PathVariable(value = "user_id") Long user_id) {
33-
Member member = memberService.findMember(user_id);
34-
return ResponseEntity.ok().body(member);
28+
public ResponseEntity<MemberDTO> memberDetails(@PathVariable(value = "user_id") Long userId) {
29+
Member member = memberService.findMember(userId);
30+
MemberDTO memberDTO = MemberDTO.createMemberDTO(member);
31+
return ResponseEntity.ok().body(memberDTO);
3532
}
3633

34+
// 사용자 프로필 수정 폼에 초기 데이터 제공
35+
@GetMapping("/{user_id}/edit")
36+
public ResponseEntity<MemberDTO> memberModify(@PathVariable(value = "user_id") Long userId) {
37+
Member member = memberService.findMember(userId);
38+
MemberDTO memberDTO = MemberDTO.createMemberDTO(member);
39+
return ResponseEntity.ok().body(memberDTO);
40+
}
3741
// 사용자 프로필 수정
3842
@PutMapping("/{user_id}/edit")
39-
public ResponseEntity<Member> memberModify(@PathVariable(value = "user_id") Long user_id, @Valid @RequestBody MemberEditForm memberEditForm) {
43+
public ResponseEntity<MemberDTO> memberModify(@PathVariable(value = "user_id") Long user_id, @Valid @RequestBody MemberEditForm memberEditForm) {
4044
Member updateMember = memberService.modifyMember(user_id, memberEditForm);
41-
return ResponseEntity.ok().body(updateMember);
45+
MemberDTO memberDTO = MemberDTO.createMemberDTO(updateMember);
46+
return ResponseEntity.ok().body(memberDTO);
4247
}
4348
}
Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.example.domain.member;
22

33

4+
import jakarta.persistence.EntityManager;
5+
import jakarta.persistence.PersistenceContext;
46
import lombok.extern.slf4j.Slf4j;
57
import org.example.domain.member.entity.Member;
68
import org.springframework.stereotype.Repository;
@@ -11,23 +13,27 @@
1113
@Slf4j
1214
@Repository
1315
public class MemberRepository {
14-
private ConcurrentHashMap<Long, Member> store = new ConcurrentHashMap<>();
16+
17+
@PersistenceContext
18+
private EntityManager em;
1519

1620
public Member save(Member member) {
17-
log.debug("save: memberId={}", member.getId());
18-
store.put(member.getId(), member);
21+
em.persist(member);
1922
return member;
2023
}
2124

2225
public Member findById(Long id) {
23-
return store.get(id);
26+
return em.find(Member.class, id);
2427
}
2528

2629
public List<Member> findAll() {
27-
return new ArrayList<>(store.values());
30+
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
31+
return members;
2832
}
2933
public Optional<Member> findByEmail(String email) {
30-
return findAll().stream().filter(m -> m.getEmail().equals(email)).findFirst();
34+
Member member = em.createQuery("select m from Member m where m.email = :email", Member.class)
35+
.setParameter("email", email).getSingleResult();
36+
return Optional.ofNullable(member);
3137
}
3238

3339
public Optional<Member> findByEmailAndPassword(String email, String password) {
@@ -41,8 +47,4 @@ public Optional<Member> findByEmailAndPassword(String email, String password) {
4147

4248
return Optional.empty();
4349
}
44-
45-
public void clearStore() {
46-
store.clear();
47-
}
4850
}
Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,36 @@
11
package org.example.domain.member;
22

3-
import org.example.domain.member.dto.MemberEditForm;
4-
import org.example.domain.member.dto.MemberForm;
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.example.domain.language.Language;
6+
import org.example.domain.member.dto.request.MemberEditForm;
7+
import org.example.domain.member.dto.request.MemberJoinForm;
8+
import org.example.domain.member.dto.response.MemberDTO;
59
import org.example.domain.member.entity.Member;
6-
import org.springframework.beans.factory.annotation.Autowired;
710
import org.springframework.stereotype.Service;
11+
import org.springframework.transaction.annotation.Transactional;
812
import org.springframework.web.bind.annotation.PutMapping;
913

1014
@Service
15+
@RequiredArgsConstructor
16+
@Transactional(readOnly = true)
17+
@Slf4j
1118
public class MemberService {
1219

1320
private final MemberRepository memberRepository;
1421

15-
@Autowired
16-
public MemberService(MemberRepository memberRepository) {
17-
this.memberRepository = memberRepository;
18-
}
19-
2022
// 회원가입
21-
public Member addMember(MemberForm memberForm){
22-
return memberRepository.save(Member.createMember(memberForm));
23+
@Transactional
24+
public Member addMember(MemberJoinForm memberForm){
25+
Member member = Member.createMember(memberForm);
26+
27+
for(String lang : memberForm.getLearning()) {
28+
Language language = Language.createLanguage(lang);
29+
member.addLearning(language);
30+
}
2331

32+
memberRepository.save(member); // language 도 함께 저장
33+
return member;
2434
}
2535

2636
// 사용자 프로필 조회
@@ -38,14 +48,21 @@ public Member findMember(Long user_id){
3848

3949
// 사용자 프로필 수정
4050
@PutMapping("/{user_id}/edit")
51+
@Transactional
4152
public Member modifyMember(Long user_id, MemberEditForm memberEditForm){
4253

4354
Member member = memberRepository.findById(user_id);
4455

4556
if(member == null) {
4657
throw new RuntimeException("존재하지 않는 사용자입니다.");
4758
}
59+
member.clearLearnings();
4860

61+
for (String lang : memberEditForm.getLearning()) {
62+
Language language = Language.createLanguage(lang);
63+
member.addLearning(language);
64+
}
4965
return member.editMember(memberEditForm);
66+
5067
}
5168
}

app/src/main/java/org/example/domain/member/dto/MemberEditForm.java renamed to app/src/main/java/org/example/domain/member/dto/request/MemberEditForm.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.example.domain.member.dto;
1+
package org.example.domain.member.dto.request;
22

33
import jakarta.validation.Valid;
44
import jakarta.validation.constraints.Pattern;
@@ -21,7 +21,7 @@ public class MemberEditForm {
2121
@Pattern(
2222
regexp = "^(ko|en|ja|cn|fr|ar|es|ru)$",
2323
message = "허용되지 않은 언어 코드입니다. (ko, en, ja, cn, fr, ar, es, ru만 허용)"
24-
) private String native_lang;
24+
) private String nativeLang;
2525

2626
@Size(min = 1, max = 5, message = "학습 언어는 1~5개까지 선택 가능합니다.") // 리스트 전체에 대한 검증
2727
private List<@Pattern(

app/src/main/java/org/example/domain/member/dto/MemberForm.java renamed to app/src/main/java/org/example/domain/member/dto/request/MemberJoinForm.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.example.domain.member.dto;
1+
package org.example.domain.member.dto.request;
22

33
import jakarta.validation.constraints.Email;
44
import jakarta.validation.constraints.NotBlank;
@@ -11,7 +11,7 @@
1111

1212
@Data
1313
@Builder
14-
public class MemberForm {
14+
public class MemberJoinForm {
1515

1616
@NotBlank(message = "이메일은 반드시 입력해야 합니다.")
1717
@Email(message = "유효한 이메일 형식이 아닙니다.")
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.example.domain.member.dto.response;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import org.example.domain.language.Language;
6+
import org.example.domain.member.entity.Member;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@Builder
12+
public class MemberDTO {
13+
private Long id;
14+
private String email;
15+
private String username;
16+
private String nationality;
17+
private String nativeLang;
18+
private String introduction;
19+
private List<String> learnings;
20+
private int follower;
21+
private int following;
22+
private int point;
23+
24+
public static MemberDTO createMemberDTO(Member member) {
25+
List<Language> learnings = member.getLearnings();
26+
List<String> languages = learnings.stream().map(Language::getLanguage).toList();
27+
28+
return MemberDTO.builder()
29+
.id(member.getId())
30+
.email(member.getEmail())
31+
.username(member.getUsername())
32+
.nationality(member.getNationality())
33+
.nativeLang(member.getNativeLang())
34+
.introduction(member.getIntroduction())
35+
.learnings(languages)
36+
.follower(member.getFollower())
37+
.following(member.getFollowing())
38+
.point(member.getPoint())
39+
.build();
40+
}
41+
}

app/src/main/java/org/example/domain/question/QuestionController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.example.domain.question.dto.request.CommentForm;
88
import org.example.domain.question.dto.request.QuestionCreateForm;
99
import org.example.domain.question.dto.request.QuestionEditForm;
10-
import org.example.domain.question.entity.Comment;
10+
import org.example.domain.comment.Comment;
1111
import org.example.domain.question.entity.Question;
1212
import org.example.domain.session.SessionConst;
1313
import org.springframework.beans.factory.annotation.Autowired;

app/src/main/java/org/example/domain/question/QuestionService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55
import org.example.domain.question.dto.request.CommentForm;
66
import org.example.domain.question.dto.request.QuestionCreateForm;
77
import org.example.domain.question.dto.request.QuestionEditForm;
8-
import org.example.domain.question.entity.Comment;
8+
import org.example.domain.comment.Comment;
99
import org.example.domain.question.entity.Question;
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.stereotype.Service;
1212
import org.springframework.web.bind.annotation.*;
1313

1414
import java.util.List;
15-
import java.util.Optional;
1615

17-
import static org.example.domain.question.entity.Comment.*;
16+
import static org.example.domain.comment.Comment.*;
1817

1918
@Slf4j
2019
@Service

app/src/main/resources/application.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ spring:
99
jpa:
1010
hibernate:
1111
ddl-auto: update
12+
show-sql: true
1213
database-platform: org.hibernate.dialect.MySQLDialect
1314
server:
1415
port: 8081

0 commit comments

Comments
 (0)