ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. 블로그 프로젝트
    프로그래밍 2022. 7. 27. 16:55
    반응형

    검색 기능을 구현하고, 로그인을 위한 서비스 코드를 작성하였다.

     

    public interface PostRepository extends JpaRepository<Post, Long> {
        List<Post> findAllByTitleContains(String title);
    
        List<Post> findAllByContentContains(String content);
    }

    Spring Data JPA는 쿼리를 굳이 작성하지 않고 함수명을 이용하여 쿼리를 만들어낼 수 있다. 처음에는 findAllByTitle 이라는 함수명으로 만들었지만, 이는 정확하게 일치해야만 그 값을 리턴하였다. 보통 검색을 할 때는 포함된 결과를 원하기 때문에, Contains를 추가해주어야 한다. 

     

    @GetMapping("/")
        public String getMain(Model model, @RequestParam(required = false) String title, @RequestParam(required = false) String content) {
            if (title == null && content == null) {
                model.addAttribute("posts", postService.readAll());
            } else if (title != null && content == null) {
                model.addAttribute("posts", postService.findByTitle(title));
            } else {
                model.addAttribute("posts", postService.findByContent(content));
            }
    
            return "main";
        }

    MainController의 한 부분이다. 검색 기능은 일단은 게시물에 대해서 구현하였다. tistory 블로그에서 검색을 해보면 /?title="" 이런식으로 URL에 파라미터가 들어가지는 것을 확인할 수 있었고, 이를 활용하여 그대로 구현해보았다. @RequestParam에서 required = false를 지정하지 않으면 검색을 하지 않았을 때의 메인 화면에서 오류가 발생하게 된다. 그러므로 반드시 작성해주어야 한다. if 분기점들은 각각 처음 메인화면, 제목으로 검색했을 때의 화면, 내용으로 검색했을 때의 화면을 지정하도록 하였다. 

     

    @NoArgsConstructor
    @Getter
    @Entity
    public class Account {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ACCOUNT_ID")
        private Long id;
    
        @Column(name = "USERNAME")
        private String username;
    
        @Column(name = "PASSWORD")
        private String password;
    
        public Account(String account, String password) {
            this.username = account;
            this.password = password;
        }
    
        public void updatePassword(String password) {
            this.password = password;
        }
    }

    계정 엔티티의 모습이다. 처음에는 User라는 엔티티명으로 하였으나, 이를 쿼리로 작성하는 JPA 구문 중에 오류가 발생하였다. 엔티티명이 User일 때 JPA에서 테이블을 만들면 private Long id 부분을 USER_ID로 만들게 된다. 여기서 USER_ID가 데이터베이스의 예약어중 하나라서 오류가 발생했던 것으로 추측했다. 그래서 엔티티명을 Account로 변경하였고, 오류를 잡을 수 있었다. 

     

    @RequiredArgsConstructor
    @Service
    public class AccountService {
        private final AccountRepository accountRepository;
    
        public Boolean login(AccountRequestDto requestDto) {
            if (accountRepository.findByUsername(requestDto.getUsername()).isPresent()) {
                Account test = accountRepository.findByUsername(requestDto.getUsername())
                        .orElseThrow(() -> new IllegalArgumentException());
    
                if (test.getPassword() == requestDto.getPassword()) {
                    return true;
                }
                else {
                    return false;
                }
            }
            else {
                return false;
            }
        }
    
        @Transactional
        public Boolean create(AccountRequestDto requestDto) {
            if (accountRepository.findByUsername(requestDto.getUsername()).isPresent()) {
                return false;
            }
            Account account = new Account(requestDto.getUsername(), requestDto.getPassword());
            accountRepository.save(account);
            return true;
        }
    
        @Transactional
        public void updatePassword(AccountRequestDto requestDto) {
            Account account = accountRepository.findByUsername(requestDto.getUsername())
                    .orElseThrow(() -> new IllegalArgumentException());
    
            account.updatePassword(requestDto.getPassword());
        }
    
        @Transactional
        public void delete(AccountRequestDto requestDto) {
            Account account = accountRepository.findByUsername(requestDto.getUsername())
                    .orElseThrow(() -> new IllegalArgumentException());
            accountRepository.delete(account);
        }
    }

    AccountService의 모습이다. 게시물이나 댓글은 그 ID값으로써 쿼리를 통해 찾을 수 있었지만, 로그인에서는 계정과 비밀번호를 서버에게 보내게 된다. 그러므로 findByUsername이라는 함수가 필요하였다. login 함수에서는 아이디부터 틀린 경우, 아이디는 같지만 비밀번호가 틀린 경우, 로그인이 성공한 경우에 대해 리턴값을 보내도록 하였다. 

    반응형

    '프로그래밍' 카테고리의 다른 글

    스프링 시큐리티 레퍼런스  (0) 2022.10.24
    8. 블로그 프로젝트  (0) 2022.07.28
    6. 블로그 프로젝트  (0) 2022.07.19
    5. 블로그 프로젝트  (0) 2022.07.17
    4. 블로그 프로젝트  (0) 2022.07.09
Designed by Tistory.