<Spring Boot> 간단한 스프링부트를 이용한 회원가입, 로그인
spring boot를 이용한 회원가입, 로그인 코드에 대해 작성해보겠습니다.
spring boot 프로젝트를 생성 후 properties 부터 설정하겠습니다.
spring.thymeleaf.cache=false
#아래는 db 설정
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=0107
server.port=80 # 포트
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show-sql=true
logging.level.org.hibernate.type.desriptor.sql=trace
spring.jpa.open-in-view=true
logging.level.web=debug
logging.level.org.hibernate.SQL = DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace
spring.mvc.log-request-details=true
spring.jpa.properties.hibernate.highlight_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
나머지는 공식이라 생각하시면 되고 port 와 db 설정만 잡으시면 됩니다.
port 80번을 지정하면 따로 url 에 포트넘버를 안 넘겨주셔도 됩니다.
저는 mariaDB를 사용하기 때문에 mariaDB로 설정하였습니다.
로그인 로직 정리
package comfullstack2.board.entity;
import java.sql.Date;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.transaction.Transactional;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class Member extends BaseEntity{
@Id
private String email;
private String password;
private String name;
private String userName;
private String postalCode;
private String addressBasic;
private String addressRest;
private String phone;
private String mobile;
private String birth;
}
dto 를 이용하여 로직이 돌아갈 동안 db에 데이터를 dto 에 buider 어노테이션을 이용하여
get /set 을 통해 entitiy로 변환 후
entity 가 crud 작업을 할 수 있습니다.
entity 하나는 테이블 하나다 라고 생각하시면 굉장히 이해하기 편합니다.
entity를 이용해 db에 테이블을 생성하고, 테이블에 curd를 담당합니다.
package comfullstack2.board.dto;
import java.sql.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MemberDTO {
private String email;
private String password;
private String name;
private String userName;
private String postalCode;
private String addressBasic;
private String addressRest;
private String phone;
private String mobile;
private String birth;
}
그러고 난 후 controller 를 생성하였습니다.
controller 뿐 만 아니라 앞으로 만들 service, dto, repository 들은 그룹 패키지 하위에 생성하여야 하면
각 viwer 역할을 할 html 파일은 src/main/resoures 하위에 있는 templetes에 생성 해주셔야 합니다.
@Controller
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
private final MemberServiceImple memberServiceImple;
@GetMapping("/home")
public void goHome(){
}
@GetMapping("/login")
public String login() {
return "login";
}
}
해당 코드는 controller 어노테이션을 붙여줘서 controller 역할을 하게 합니다.
home 과 login 이라는 view 를 생성하여 get, post mapping 을 해줍니다
login view에 form 에 method 를 post 로 지정하고 버튼에 submit을 주어서 클릭을 하면 데이터가 날라가게 세팅했습니다.
위 코드에서 사용된 @~Mapping 내 맘대로 정리.
@GetMapping - Spring이 자동으로 src/main/resouces의 templates에서 hello라는 이름의 View를 찾아서 반환해준다.
@PostMapping - html에 submit 이벤트 등 데이터를 전달 할 떄 사용되며 redirect 를 통해 해당 html view 를 찾아 반환 또는
@requestParam 을 통해 html에 request 선언된 항목에 데이터를 컨트롤러에 파람으로 넘겨줍니다.
import org.springframework.data.jpa.repository.JpaRepository;
import comfullstack2.board.dto.MemberDTO;
import comfullstack2.board.entity.Member;
public interface MemberRepository extends JpaRepository<Member, String>{
void save(MemberDTO dto);
Member findByUserName(String userName);
}
스프링 부트에 JpaRepository 를 extends 하여 회원 가입 등 다양한 곳에 이용한 save 와 findby~~ 메서드를 선언합니다.
선언과 동시에 해당 메서드는 기능까지 구현 됩니다.
이제 서비스를 만들 건데 서비스는 두 번에 걸쳐 생성해줍니다.
MemberService 는 추상메서드를 선언해주는 interface로 생성하고MemberServiceImpl 이라는 클래스를 만들어 @Service 어노테이션을 달아 Service 클래스로 만들어줍니다
package comfullstack2.board.service;
public interface MemberService {
boolean checkinfo(String email, String password);
}
package comfullstack2.board.service;
import org.springframework.stereotype.Service;
import comfullstack2.board.entity.Member;
import comfullstack2.board.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class MemberServiceImple implements MemberService {
private final MemberRepository memberRepository;
@Override
public boolean checkinfo(String userName, String password) {
Member member= memberRepository.findByUserName(userName);
if (member != null && member.getPassword().equals(password)) {
return true; // 이메일과 비밀번호가 일치하는 회원이 있으면 true 반환
}
return false;
}
}
service 인터페이스 에서 boolean 타입에 로그인 검증 메서드를 선언 후
serviceImpl 클래스에서 해당 메서드를 정의해줍니다.
여기서 repository 에서 생성한 findbyUserName 을 이용하기위해 final 형태로 repository를 불러오고
스프링 부트에 final 선언 시 필요한 requiredArsConstructor 어노테이션을 호출해줍니다.
여기까지 로그인에 사용할 서비스,repository 작업이 끝났습니다.
그럼 다시 controller 로 이동해줍니다.
@PostMapping("/login")
public String loginlogic(String userName, String password, RedirectAttributes redirectAttributes) {
boolean check =memberServiceImple.checkinfo(userName, password);
if (check) {
System.err.println("로그인 성공");
return "redirect:/home";
}
else {
System.err.println("로그인 실패");
return "redirect:/login";
}
}
컨트롤러에 파라미터로 userName과 password 그리고 reture 으로 redirect 를 하기위해
RedirectAttributes 객체 파라미터로 줍니다 이렇게 하면 로그인 로직은 완성입니다 .
회원가입 로직 까지 작성 완료 후 실행결과를 함께 보여드리겠습니다.
회원가입로직
@GetMapping("/join")
public void getJoin() {
}
@PostMapping("/join")
public String register(
}
아까 생성했던 controller 에 해당 코드를 작성해줍니다.
해당 코드는 아까 위에서 설명과 동일합니다.
만든 후 html에 name 이 들어있는 태그 안에 require 을 줍니다.
@PostMapping("/join")
public String register(
@RequestParam("userName") String userName,
@RequestParam("password") String password,
@RequestParam("confirm-password") String confirm,
@RequestParam("name") String name,
@RequestParam("phone-area") String phoneArea,
@RequestParam("phone-number") String phoneNumber,
@RequestParam("phone-ext") String phoneExt,
@RequestParam("mobile-area") String mobileArea,
@RequestParam("mobile-number") String mobileNumber,
@RequestParam("mobile-ext") String mobileExt,
@RequestParam("postal-code") String postalCode,
@RequestParam("birth-year") String birthYear,
@RequestParam("birth-month") String birthMonth,
@RequestParam("birth-day") String birthDay,
@RequestParam("address-basic") String addressBasic,
@RequestParam("address-rest") String addressRest,
@RequestParam("email") String email,
RedirectAttributes redirectAttributes) {
// 생년월일 정보를 조합하여 birth 문자열을 생성
String birth = birthYear + "-" + birthMonth + "-" + birthDay;
if (password.equals(confirm)) {
Member member = Member.builder()
.userName(userName)
.password(password)
.name(name)
.postalCode(postalCode)
.addressBasic(addressBasic)
.addressRest(addressRest)
.phone(phoneArea + phoneNumber + phoneExt)
.mobile(mobileArea + mobileNumber + mobileExt)
.email(email)
.birth(birth)
.build();
memberRepository.save(member);
return "redirect:/login";
} else {
System.err.println("비밀번호 틀림");
return "redirect:/join";
}
@RequireParam
문법 )) @RequireParam("require name") type 파라미터
이렇게 해주면 view 에서 입력 받은 값을 파라미터로 받아 올 수있다.
이 어노테이션을 이용하기 위해서는 view 에 require 을 작성해야한다.
다음은 실행결과입니다.
회원가입
DB에 정상적으로 insert 되고
로그인 폼으로 넘어가는 것을 볼 수있다.
로그인
이렇게 home 으로 이동 되는 것을 확인 할 수 있습니다.
이렇게 회원가입, 로그인 포스팅을 끝내겠습니다.