Skip to content

Commit d2bb4a5

Browse files
committed
유저 부분 (로그인,CRUD,배포) 병합
1 parent 4a11b3e commit d2bb4a5

File tree

6 files changed

+201
-9
lines changed

6 files changed

+201
-9
lines changed

src/main/java/codeview/main/config/SecurityConfig.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
1515
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
1616
import org.springframework.security.config.http.SessionCreationPolicy;
17+
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
1718
import org.springframework.security.web.SecurityFilterChain;
1819
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
1920
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@@ -36,7 +37,6 @@ public WebSecurityCustomizer webSecurityCustomizer() {
3637
@Bean
3738
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
3839
http
39-
// REST API
4040
.csrf(AbstractHttpConfigurer::disable)
4141
.cors(AbstractHttpConfigurer::disable)
4242
.httpBasic(AbstractHttpConfigurer::disable)
@@ -45,7 +45,6 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
4545
.headers(c -> c.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable).disable())
4646
.sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
4747

48-
// Request 인증, 인가 설정
4948
.authorizeHttpRequests(request -> request.requestMatchers(
5049
new AntPathRequestMatcher("/"),
5150
new AntPathRequestMatcher("/home"),
@@ -55,17 +54,17 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
5554
).permitAll()
5655
.anyRequest().authenticated())
5756

58-
// OAuth2 설정 (OAuth 인증 성공 후 사용자 정보 처리 설정 담당)
59-
.oauth2Login(oauth -> oauth.userInfoEndpoint().userService(customOAuth2UserService)
60-
.and().successHandler(oAuth2SuccessHandler))
61-
// JWT 설정
57+
.oauth2Login(oauth -> oauth
58+
.loginPage("/login")
59+
.successHandler(oAuth2SuccessHandler)
60+
.userInfoEndpoint(userInfo -> userInfo
61+
.userService(customOAuth2UserService)))
6262
.addFilterBefore(tokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
6363
.addFilterBefore(new TokenExceptionFilter(), TokenAuthenticationFilter.class)
6464

65-
// 예외 처리 설정
6665
.exceptionHandling((exceptions) -> exceptions
6766
.authenticationEntryPoint(new CustomAuthenticationEntryPoint())
6867
.accessDeniedHandler(new CustomAccessDeniedHandler()));
6968
return http.build();
7069
}
71-
}
70+
}

src/main/java/codeview/main/controller/HomeController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ public class HomeController {
88

99
@GetMapping("/home")
1010
public String home() {
11-
return "home"; // home.html 템플릿을 반환
11+
return "home";
1212
}
1313
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package codeview.main.controller;
2+
3+
import codeview.main.entity.Member;
4+
import codeview.main.service.MemberService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.security.core.Authentication;
9+
import org.springframework.web.bind.annotation.*;
10+
11+
import java.util.Optional;
12+
13+
@RestController
14+
@RequestMapping("/user")
15+
@RequiredArgsConstructor
16+
public class MemberController {
17+
18+
private final MemberService memberService;
19+
20+
@GetMapping("/me")
21+
public ResponseEntity<Member> getUserInfo(Authentication authentication) {
22+
String email = authentication.getName();
23+
Optional<Member> member = memberService.findByEmail(email);
24+
return member.map(value -> new ResponseEntity<>(value, HttpStatus.OK))
25+
.orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
26+
}
27+
28+
@PutMapping("/update")
29+
public ResponseEntity<Member> updateUserInfo(Authentication authentication, @RequestBody Member updatedMember) {
30+
String email = authentication.getName();
31+
Optional<Member> member = memberService.findByEmail(email);
32+
33+
if (member.isPresent()) {
34+
Member currentMember = member.get();
35+
currentMember.setName(updatedMember.getName());
36+
currentMember.setProfile(updatedMember.getProfile());
37+
memberService.save(currentMember);
38+
return new ResponseEntity<>(currentMember, HttpStatus.OK);
39+
} else {
40+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
41+
}
42+
}
43+
44+
@DeleteMapping("/delete")
45+
public ResponseEntity<Void> deleteUser(Authentication authentication) {
46+
String email = authentication.getName();
47+
Optional<Member> member = memberService.findByEmail(email);
48+
49+
if (member.isPresent()) {
50+
memberService.deleteByEmail(email);
51+
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
52+
} else {
53+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
54+
}
55+
}
56+
}

src/main/java/codeview/main/repository/MemberRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77

88
public interface MemberRepository extends JpaRepository<Member, Long> {
99
Optional<Member> findByEmail(String email);
10+
void deleteByEmail(String email);
1011
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package codeview.main.service;
2+
3+
import codeview.main.entity.Member;
4+
import codeview.main.repository.MemberRepository;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.util.Optional;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class MemberService {
13+
14+
private final MemberRepository memberRepository;
15+
16+
public Optional<Member> findByEmail(String email) {
17+
return memberRepository.findByEmail(email);
18+
}
19+
20+
public Member save(Member member) {
21+
return memberRepository.save(member);
22+
}
23+
24+
public void deleteByEmail(String email) {
25+
memberRepository.deleteByEmail(email);
26+
}
27+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package codeview.main.controller;
2+
3+
import codeview.main.entity.Member;
4+
import codeview.main.service.MemberService;
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
import org.mockito.InjectMocks;
8+
import org.mockito.Mock;
9+
import org.mockito.MockitoAnnotations;
10+
import org.springframework.http.HttpStatus;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.security.core.Authentication;
13+
14+
import java.util.Optional;
15+
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
import static org.mockito.ArgumentMatchers.anyString;
18+
import static org.mockito.Mockito.*;
19+
20+
class MemberControllerTest {
21+
22+
@Mock
23+
private MemberService memberService;
24+
25+
@Mock
26+
private Authentication authentication;
27+
28+
@InjectMocks
29+
private MemberController memberController;
30+
31+
private Member member;
32+
33+
@BeforeEach
34+
void setUp() {
35+
MockitoAnnotations.openMocks(this);
36+
member = Member.builder()
37+
38+
.name("SoEun")
39+
.profile("Profile Image")
40+
.build();
41+
}
42+
43+
@Test
44+
void testGetUserInfo_Success() {
45+
when(authentication.getName()).thenReturn(member.getEmail());
46+
when(memberService.findByEmail(anyString())).thenReturn(Optional.of(member));
47+
48+
ResponseEntity<Member> response = memberController.getUserInfo(authentication);
49+
50+
assertEquals(HttpStatus.OK, response.getStatusCode());
51+
assertEquals(member, response.getBody());
52+
}
53+
54+
@Test
55+
void testGetUserInfo_NotFound() {
56+
when(authentication.getName()).thenReturn(member.getEmail());
57+
when(memberService.findByEmail(anyString())).thenReturn(Optional.empty());
58+
59+
ResponseEntity<Member> response = memberController.getUserInfo(authentication);
60+
61+
assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
62+
}
63+
64+
@Test
65+
void testUpdateUserInfo_Success() {
66+
when(authentication.getName()).thenReturn(member.getEmail());
67+
when(memberService.findByEmail(anyString())).thenReturn(Optional.of(member));
68+
when(memberService.save(any(Member.class))).thenReturn(member);
69+
70+
Member updatedMember = Member.builder().name("Jane Doe").profile("Updated Profile").build();
71+
ResponseEntity<Member> response = memberController.updateUserInfo(authentication, updatedMember);
72+
73+
assertEquals(HttpStatus.OK, response.getStatusCode());
74+
assertEquals("Jane Doe", response.getBody().getName());
75+
assertEquals("Updated Profile", response.getBody().getProfile());
76+
}
77+
78+
@Test
79+
void testUpdateUserInfo_NotFound() {
80+
when(authentication.getName()).thenReturn(member.getEmail());
81+
when(memberService.findByEmail(anyString())).thenReturn(Optional.empty());
82+
83+
Member updatedMember = Member.builder().name("Jane Doe").build();
84+
ResponseEntity<Member> response = memberController.updateUserInfo(authentication, updatedMember);
85+
86+
assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
87+
}
88+
89+
@Test
90+
void testDeleteUser_Success() {
91+
when(authentication.getName()).thenReturn(member.getEmail());
92+
when(memberService.findByEmail(anyString())).thenReturn(Optional.of(member));
93+
94+
ResponseEntity<Void> response = memberController.deleteUser(authentication);
95+
96+
verify(memberService, times(1)).deleteByEmail(anyString());
97+
assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());
98+
}
99+
100+
@Test
101+
void testDeleteUser_NotFound() {
102+
when(authentication.getName()).thenReturn(member.getEmail());
103+
when(memberService.findByEmail(anyString())).thenReturn(Optional.empty());
104+
105+
ResponseEntity<Void> response = memberController.deleteUser(authentication);
106+
107+
assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
108+
}
109+
}

0 commit comments

Comments
 (0)