zoaseo
To Infinity And Beyond
zoaseo
전체 방문자
오늘
어제
  • 분류 전체보기 (760)
    • 개발이 좋아서 (378)
      • Java가 좋아서 (42)
      • Spring이 좋아서 (50)
      • JPA가 좋아서 (0)
      • QueryDSL이 좋아서 (26)
      • Docker가 좋아서 (7)
      • Redis가 좋아서 (7)
      • AWS가 좋아서 (5)
      • CI/CD가 좋아서 (6)
      • Troubleshooting이 좋아서 (4)
      • Kotlin이 좋아서 (7)
      • SQL이 좋아서 (6)
      • HTTP가 좋아서 (21)
      • JavaScript가 좋아서 (30)
      • TypeScript가 좋아서 (6)
      • Vue가 좋아서 (21)
      • Flutter가 좋아서 (61)
      • React가 좋아서 (20)
      • Redux(React)가 좋아서 (2)
      • Angular가 좋아서 (22)
      • HTML이 좋아서 (9)
      • CSS가 좋아서 (15)
      • PHP가 좋아서 (9)
      • Illustrator가 좋아서 (2)
    • 노력이 좋아서 (169)
    • 결과물이 좋아서 (14)
    • 코딩연습이 좋아서 (78)
      • 이론이 좋아서 (62)
      • SQL이 좋아서 (0)
    • 유용한 사이트가 좋아서 (28)
    • Github (2)

인기 글

티스토리

hELLO · Designed By 정상우.
zoaseo

To Infinity And Beyond

개발이 좋아서/Spring이 좋아서

[Backend] - 로그인 및 회원가입(api)

2022. 10. 25. 14:34

1) LoginApi

package clonestudy.clonestudy.login.api;

import clonestudy.clonestudy.exception.ShjException;
import clonestudy.clonestudy.login.model.LoginLog;
import clonestudy.clonestudy.login.service.JwtService;
import clonestudy.clonestudy.login.service.LoginService;
import clonestudy.clonestudy.login.vo.LoginLogVO;
import clonestudy.clonestudy.login.vo.LoginVO;
import clonestudy.clonestudy.share.ResponseEnum;
import clonestudy.clonestudy.share.ResponseMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

@Api(tags = "로그인")
@RestController
@RequestMapping(value = "/v1")
@Slf4j
public class LoginApi {

    @Autowired
    private LoginService loginService;
    @Autowired
    private JwtService jwtService;

    @ApiOperation(value = "로그인", notes = "로그인")
    @PostMapping("/signin")
    public ResponseMessage memberLogin(@RequestBody LoginVO loginVO, HttpServletRequest request) throws NoSuchAlgorithmException, ShjException {
        ResponseMessage responseMessage = loginService.memberLogin(loginVO);
        ResponseEnum responseEnum = loginService.memberLog(loginVO);
        loginService.saveLoginLog(loginVO.getEmail(), responseEnum, getUserIp(request));
        loginService.updateMemberLoginData(loginVO.getEmail(), responseEnum);
        return responseMessage;
    }

    @ApiOperation(value = "로그인 로그 조회", notes = "로그인 로그 조회")
    @ApiImplicitParam(name = "first", value = "로그 조회 범위 시작 지점 ex) 2022-10-07 18:30:00")
    @GetMapping("/login-log/{first}/{end}/{email}")
    public ResponseMessage findLoginLogList(@PathVariable String first, @PathVariable String end, @PathVariable String email, HttpServletRequest request) throws ShjException {

        String token = request.getHeader("x-access-token");
        jwtService.verify(token);
        LoginLogVO loginLogVO = new LoginLogVO(first, end, email);
        List<LoginLog> loginLogList = loginService.findLoginLogList(loginLogVO);
        return new ResponseMessage(ResponseEnum.SUCCESS, loginLogList);

    }

    //IPv4로?
    private String getUserIp(HttpServletRequest request) {
        String ip = request.getHeader("X-FORWARDED-FOR");
        if (ip == null || ip.length() == 0) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0) {
            ip = request.getHeader("WL-Proxy-Client-IP"); //웹로직
        }
        if (ip == null || ip.length() == 0) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}

2) MemberApi

package clonestudy.clonestudy.member.api;

import clonestudy.clonestudy.exception.ShjException;
import clonestudy.clonestudy.login.service.JwtService;
import clonestudy.clonestudy.member.dto.MemberInfoDTO;
import clonestudy.clonestudy.member.service.MemberService;
import clonestudy.clonestudy.member.vo.MemberRegVO;
import clonestudy.clonestudy.share.ResponseEnum;
import clonestudy.clonestudy.share.ResponseMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Api(tags = "사용자")
@RestController
@RequestMapping(value = "/v1")
@Slf4j
public class MemberApi {

    @Autowired
    MemberService memberService;

    @Autowired
    JwtService jwtService;

    @ApiOperation(value = "회원가입", notes = "회원가입")
    @PostMapping("/signup") @Validated
    public ResponseMessage saveMember(@RequestBody MemberRegVO memberRegVO) throws ShjException {
        memberService.checkDuplicateMemberInfo(memberRegVO);
        memberService.saveMember(memberRegVO);
        return new ResponseMessage<ResponseEnum>(ResponseEnum.SUCCESS);
    }

    @ApiOperation(value = "회원조회", notes = "회원조회")
    @GetMapping("/search/{email}")
    public ResponseMessage findMember(@PathVariable String email, HttpServletRequest request) throws ShjException {
        String token = request.getHeader("x-access-token");
        jwtService.verify(token);

        MemberInfoDTO memberInfoDTO = memberService.findMember(email);
        return new ResponseMessage<>(ResponseEnum.SUCCESS, memberInfoDTO);
    }
}

'개발이 좋아서 > Spring이 좋아서' 카테고리의 다른 글

DI (Dependency Injection) / IoC (Inversion of Control) 예제로 알아보자  (0) 2024.12.27
좋은 객체 지향 설계의 5가지 원칙 (SOLID)  (1) 2024.12.20
[Backend] - 로그인 및 회원가입(회원가입_dto, model, vo)  (0) 2022.10.25
[Backend] - 로그인 및 회원가입(회원가입_service, repository)  (0) 2022.10.25
[Backend] - 로그인 및 회원가입(로그인_dto, model, vo)  (0) 2022.10.25

    티스토리툴바