Spring Boot

<Spring Boot> 간단한 스프링부트를 이용한 회원가입, 로그인

98kg 2023. 9. 5. 22:43

  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 으로 이동 되는 것을 확인 할 수 있습니다.

 


이렇게  회원가입, 로그인 포스팅을 끝내겠습니다.