프로젝트

[SpringBoot & JPA 프로젝트] 사용자 / 판매자 카카오 로그인하기

sian han 2022. 9. 29. 16:15

프로젝트 초반에 진행했던건데 이제와서 포스팅을 작성해본다.

뜨개장터는 사용자(USER)와 판매자(SELLER)가 가진 권한과 정보가 다르다.

예를 들면
판매자만 '상품등록' 페이지 접속이 가능하고
사용자는 주소 (ADDRESS) 정보를, 판매자는 상호명(STORE) 정보를 독자적으로 갖게된다는 점이 그렇다.

첫번째로는 MEMBER 테이블을 만들고
Role을 USER와 SELLER 로 주었다.

Role 별로 갖는 정보가 다르니 NULL 값을 가진 컬럼이 많이 생긴다. 맘에 안들었다 ( 나눌수 있는만큼 나누는걸 선호함 )

문제점이 생겼다.

뜨개장터는 카카오 로그인만 가능하다.
카카오 로그인 시 해당 사용자가 어떤 Role 로 로그인 하는지 확인이 불가하다.

>> 다시생각해보자. 한 테이블에서 모든 정보가 같고 Role 만 다른 두 데이터를 어떻게 구분 가능할까 ?
- 조건 : 카카오 에서 응답 받은 후 리다이렉트 uri 로 바로 확인이 가능해야한다.
- 해결 : 다시 생각해봐도 역시 리다이렉트 url 뒤에 조건을 붙여서 리다이렉트되는 경로를 다르게 해서 해결 할 것 같다.
현재의 나로선 아래 해결방법이 최선이다. 더 좋은 방법이 생각나면 다시 오겠다



MEMBER 테이블을 USER 와 SELLER 로 나누기로 결정한다.

▷ USER

public class User extends BaseEntity {

    @Id
    @Column(name="user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id; // 회원번호

    @Column(nullable = false)
    private String name; //이름

    @Column
    private String email; //이메일

    @Column
    private String hp; //전화번호

    @Builder
    public User(String name, String email,String hp) {
        this.name = name;
        this.email = email;
        this.hp = hp;
    }
}


▷ SELLER

public class Seller extends BaseEntity {

    @Id
    @Column(name="seller_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id; // 회원번호

    @Column(nullable = false)
    private String name; //이름

    @Column
    private String email; //이메일

    @Column
    private String store; //가게이름

    @OneToMany(mappedBy = "seller", fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @OrderBy("id asc")
    private List<Item> item = new ArrayList<>(); // 판매자가 판매중인 상품들

    @Column
    private String hp; //전화번호

    @Builder
    public Seller(String name, String email,String hp) {
        this.name = name;
        this.email = email;
        this.hp = hp;
    }

    public void updateStore(String store){
        this.store = store;
    }
}


오케이 둘이 나눴고


일반회원 || 판매자 Checkbox 선택에 따라
카카오에서 응답받은 정보는 USER 또는 SELLER 테이블에 입력되어야 한다.

위 문제를 해결하기 위해
카카오 URL 로 이동하는 코드를 아래와 같이 짰다

$(function () {
    $('#kakaoLoginBtn').click(function(){
        var role = "";
        if ($('#checkbox_user').is(":checked")) {
            role = "user";
        } else {
            role = "seller";
        }
        var kakaoUrl = "https://kauth.kakao.com/oauth/authorize?" +
            "client_id=" +
            "&redirect_uri=http://knitmarket.shop/kakaoLogin/requestToken_" + role +
        "&response_type=code";
        location.href = kakaoUrl;
    });//한개만 선택되게하기
});

Role 을 넣어 판매자 / 사용자를 구분해서 redirect URI 를 다르게 했다

좀 무식한 방법일수도 있지만 구글링 해도 답이없는 이 문제를 난 어떻게든 해결해야만 했다

 

 //http://localhost:8086/kakaoLogin/requestToken_seller
    @RequestMapping(value = "/kakaoLogin/requestToken_seller") // 판매자 회원 로그인
    public String kakaoLoginRequestToken_seller(@RequestParam("code") String code, Model model,
                                         HttpServletRequest request) {

Controller 에서 위와 같이 받는거다.
Role 에 알맞은 컨트롤러로 리다이렉트 되어
판매자 또는 사용자 테이블에 값이 입력되게 만들었다.