본문 바로가기
SPRING

[Spring] JPA를 활용한 로그인 구현

by 킹명주 2022. 7. 15.

https://mjoo1106.tistory.com/entry/Spring-JPA%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EA%B5%AC%ED%98%84

 

[Spring] JPA를 활용한 회원가입 구현

앞서 MyBatis를 활용해서 DB와 연결하고 Login을 구현했다. 그러나 요즘은 JPA가 대세라 무조건 한 번은 경험하고 넘어가야 한다. 그래서 JPA를 활용해서 회원가입을 구현해보고자 한다. JPA JPA는 Java P

mjoo1106.tistory.com

앞서 JPA를 활용해서 DB에 INSERT하는 작업까지 수행했다. 이를 이제 조회하고자 한다. View를 따로 만들지 않고 API 통신으로 확인할 에정이다.


프로젝트 구조

 

구조는 회원가입을 만들었을 때와 동일하다. 여기서 조회 쿼리만 추가 생성하면 된다. 이를 생성하기 위해 controller, repository, service의 코드 수정이 필요하므로 각각을 알아보자.


 

로그인 구현

 

1. domain > Member

package com.example.jpa_practice.domain;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@Entity
@NoArgsConstructor
@Table(name="test2")
public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String email;
    private String password;

    public Member(String email, String password) {
        this.email=email;
        this.password=password;
    }
}

자세한 설명은 회원가입 게시글에 올려놨기 때문에 넘어가겠다. 

 

2. repository > MemberRepository

package com.example.jpa_practice.repository;

import com.example.jpa_practice.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface MemberRepository extends JpaRepository<Member, Long> {
    /*
        save() : 레코드 저장 (insert, update)
        findOne() : primary key로 레코드 한건 찾기
        findAll() : 전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능
        count() : 레코드 갯수
        delete() : 레코드 삭제
        findBy : 쿼리를 요청하는 메서드 임을 알림
        counyBy : 쿼리 결과 레토드 수를 요청하는 메서드 임을 알림
   */
    @Query(value="select password from test2 where email=:email", nativeQuery = true)
    String findPwd(@Param("email") String email);
}

@Query를 사용해서 DB를 조회했다. value에는 말 그대로 SQL 문법을 작성하면 된다. 그리고 뒤에 nativeQuery라는 것이 보인다. 쿼리를 작성할 때 2가지 형태가 존재하는데 첫 번째로는 JPQL(Java Persistence Query Language)이다. JPQL은 테이블이 아닌 엔티티 객체를 대상으로 검색하는 객체지향 쿼리이다. 또한 SQL을 추상화해서 SQL에 의존하지 않는다는 특징이 있다.

# 엔티티와 속성은 대소문자 구분
# JPQL 키워드는 구분하지 않음
# 테이블 명 대신 엔티티 명을 사용한다.
# 별칭은 필수다.
SELECT m FROM Member AS m WHERE m.email = 'mjoo1106'

두 번째로 SQL이다. 기존의 SQL 문법을 사용할 수 있다. 

여기서 주의해야할 점은 nativeQuery = ture를 반드시 추가해야 한다는 것이다. 

 

그리고 코드에 보면 @Param("email")을 확인할 수 있는데, 이는 쿼리문에 parameter를 삽입하기 위해 지정한 것이다. 즉, 쿼리를 해석해보면 test2 table에서 입력받은 email를 조회하여 password를 반환한다는 것을 알 수 있다.

 

3. serivce > JpaService

package com.example.jpa_practice.service;

import com.example.jpa_practice.domain.Member;
import com.example.jpa_practice.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class JpaService {
    private final MemberRepository memberRepository;
    public void joinUser(Member member){
        memberRepository.save(member);
    }
    public String SelectUser(String email){return memberRepository.findPwd(email);}
}

SelectUser 함수를 통해 pwd를 반환 받게 된다. 위의 joinUser는 insert를 위한 함수이므로 작성하지 않고 진행해도 상관 없다.

 

4. controller > JpaController

package com.example.jpa_practice.controller;

import com.example.jpa_practice.domain.Member;
import com.example.jpa_practice.service.JpaService;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;


import java.util.Map;

@RestController
@RequiredArgsConstructor
public class JpaController {
    private final JpaService jpaService;
    @ResponseBody
    @RequestMapping(value="/login", method= RequestMethod.GET)
    public String post_list(@RequestParam(value="email")String email, @RequestParam(value="pwd")String pwd){
        String ans;
        if(jpaService.SelectUser(email).equals(pwd)) ans="Login Success";
        else ans="Login Fail";
        return ans;
    }
    @RequestMapping(value="/join", method= RequestMethod.POST)
    public String login(@RequestBody Map<String,Object> param){
        System.out.println(param.get("date"));
        Member member=new Member(param.get("email").toString(),param.get("password").toString());
        jpaService.joinUser(member);
        return "회원가입 성공";
    }
}

회원가입은 앞서 설명했기 때문에 생략하고 login에 대해서만 설명하고자 한다.

Service에서 작성했던 SelectUser 함수를 통해 pwd를 반환받는다. 이 때 front에서 입력한 email 값을 반드시 넣어주어야 한다.

만약 성공했다면 Login Success, 실패했다면 Login Fail을 반환한다.


 

결과


MyBatis를 활용한 로그인이나 Jpa를 활용한 로그인이나 해보는게 중요하다는 생각으로 진행한 것이지 이 포스트를 참고하고 로그인을 구현하는건 말도 안된다고 생각한다. 그만큼 간단한 구조로 작성했기 때문에 쿼리를 조회해보고 삽입할 수 있다는 실험 정도로 생각하면 된다.

 

현재 스프링 강의도 들으면서 백엔드 역량을 키우고 있는데 강의보다 중요한건 일단 머리부터 박아봐야한다. 그래서 이렇게 간단한 실험도 해보는 것이다. 스프링 코드들을 보면 몇 줄 안되는 것 같지만 저기에 많은 시행착오들이 들어있다. 그래서 좋은 강의를 듣는 것 보다는 직접 구현해보고 문제를 슈팅해보는 것을 추천한다. 그렇다면 10배 이상의 경험치를 획득할수도..