5 글 보임 - 1 에서 5 까지 (총 5 중에서)
-
글쓴이글
-
2024년 5월 24일 14:51 #123986
윤형주참가자기존 코드는 현재 로그인 중인 유저의 이름을 Spring security로 가져와 db에서 가져오는 코드였습니다. 하지만 중복된 이름을 가진 유저가 발생해 쿼리 결과가 2개 이상 리턴이 되는 문제가 발생해 검색을 로그인 한 유저의 email로 db에서 찾아
리턴 하려고 합니다. 현재 로그인 중인 유저의 이름은 정상적으로 나오지만, email은 null값이 나와 이런 저런 코드를 수정해보고 채찍피티를 돌려도
항상 결과가 null 값입니다. 최근 몇주간 전혀 해결할 방법을 찾지못해 너무 답답합니다. 도와주세요~!!! ㅠㅠㅠ
package garabu.garabuServer.domain;
import jakarta.persistence.*; import jakarta.validation.constraints.Email; import lombok.Getter; import lombok.Setter;
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID;
@Entity @Getter @Setter public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; // 회원 식별자 Id
@Column(updatable = false, unique = true) private UUID uuid = UUID.randomUUID(); // 회원의 UUID
private String username; // 닉네임 private String name; @Email private String email; // 이메일 private String password; // 비번 private String role;
@OneToMany(mappedBy = "member") private List<UserBook> userBooks = new ArrayList<>();
}
----------------------------------------------------------
package garabu.garabuServer.service;
import garabu.garabuServer.domain.Book; import garabu.garabuServer.domain.Member; import garabu.garabuServer.jwt.CustomUserDetails; import garabu.garabuServer.repository.BookRepository; import garabu.garabuServer.repository.MemberJPARepository; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service;
import java.util.List; import java.util.UUID;
@Service @RequiredArgsConstructor public class BookService {
private final BookRepository bookRepository; private final MemberJPARepository memberRepository;
public Book createBook(String title) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentUserName = authentication.getName(); Member owner = memberRepository.findByUsername(currentUserName);
Book book = new Book(); book.setOwner(owner); book.setTitle(title);
bookRepository.save(book); return book; }
private String getEmail(){ Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication(); return loggedInUser.getName(); }
public List<Book> findLoggedInUserBooks() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal(); String email = userDetails.getEmail();
System.out.println(authentication); System.out.println(userDetails ); System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); System.out.println(email);
Member owner = memberRepository.findOneByEmail(email); return bookRepository.findByOwner(owner); }
public Book findById(Long id) { return bookRepository.findById(id).orElseThrow(() -> new RuntimeException("Book not found")); }
public Book findByTitle(String title) { return bookRepository.findByTitle(title); } //book. 가계부를 커플, 개인, 모임용으로 나누기 위해. //사용자 입력 //가계부 이름 등록 //
}
------------------------------------------------------
package garabu.garabuServer.jwt;
import garabu.garabuServer.domain.Member; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList; import java.util.Collection; import java.util.UUID;
public class CustomUserDetails implements UserDetails {
private final Member member;
public CustomUserDetails(Member member) {
this.member = member; }
@Override public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new GrantedAuthority() {
@Override public String getAuthority() {
return member.getRole(); } });
return collection; }
@Override public String getPassword() {
return member.getPassword(); }
@Override public String getUsername() {
return member.getUsername(); }
public String getEmail() {
return member.getEmail(); }
public UUID getUuid() { return member.getUuid(); }
@Override public boolean isAccountNonExpired() {
return true; }
@Override public boolean isAccountNonLocked() {
return true; }
@Override public boolean isCredentialsNonExpired() {
return true; }
@Override public boolean isEnabled() {
return true; } }
-----------------------------------------------
package garabu.garabuServer.api;
import garabu.garabuServer.domain.Book; import garabu.garabuServer.service.BookService; import jakarta.validation.Valid; import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RequiredArgsConstructor public class BookApiController { private final BookService bookService;
@PostMapping("/api/v2/book") public CreateBookResponse saveBookV2(@RequestBody @Valid CreateBookRequest request) { // BookService 내에서 현재 로그인한 사용자를 기반으로 새로운 Book을 생성 Book book = bookService.createBook(request.getTitle()); return new CreateBookResponse(book.getId()); }
@GetMapping("/api/v2/book/mybooks") public ResponseEntity<List<Book>> getMyBooks() { List<Book> books = bookService.findLoggedInUserBooks(); return ResponseEntity.ok(books); }
@Data static class CreateBookRequest { private String title; // 가계부 이름 }
@Data static class CreateBookResponse { private Long id; // 생성된 가계부의 ID
public CreateBookResponse(Long id) { this.id = id; } } }
-----------------------------------------------
package garabu.garabuServer.repository;
import garabu.garabuServer.domain.Member; import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface MemberJPARepository extends JpaRepository<Member, Long> { List<Member> findByEmail(String email); Member findByUsername(String username); Member findOneByEmail(String email); }
2024년 5월 24일 16:19 #124003
윤형주참가자어느 코드를 보내드려야할지 몰라 일단 서버측 연관 코드만 올립니다..... 혹시 괜찮으시다면 이메일로 압축파일을 드리거나 github 주소를 드리고
전체 코드에서의 문제점을 피드백 받아보고싶습니다...
2024년 5월 25일 12:48 #124061
윤형주참가자네... 해당 메서드로 검색하면 null 값이 나옵니다.. userdtails나 OAuth2service에서 email을 추가해 사용해도 null 입니다 ..ㅜㅜ
2024년 5월 25일 15:54 #124080
codingapple키 마스터String email = userDetails.getEmail(); 변수가 문자로 잘나오나 뒤에 이상한 공백 없나 확인해봅시다
-
글쓴이글
5 글 보임 - 1 에서 5 까지 (총 5 중에서)
- 답변은 로그인 후 가능합니다.