중앙정보기술인재개발원/Spring

[Spring] | final projcet_2

soidev 2025. 4. 29. 20:04

loginPage.html

<h1>로그인 페이지</h1>
<form action="/user/loginProcess" method="post">
아이디 : <input name="accountName" type="text"><br>
비밀번호 : <input name="password" type="password"><br>
<!-- 받는 쪽에서 dto객체로 안 받구 단위로 받을 것임! -->
<button>로그인</button><br>
<!--
/ : 절대경로
단점 - 타자를 많이 쳐사
./ : 상대경로 하면 user/registerPage로 됨 <- 많이씀
./registerPage = registerPage 똑같은 경로임
수업은 절대경로로 수업할것임!
진짜 경로 : http://localhost:8080/user.registerpage
-->
</form>
  • <form>태그 사용시엔 많은 확률로 method=post방식으로 사용할 것.
  • 버튼을 추가함! 여기서 아이디 비번을 받고 db로 넘길것!

 

UserController.java

@RequestMapping("loginProcess")
public String loginProcess(
      HttpSession session, //sessuin저장공간을 스프링한테 요청할 수 있음
      //이 세션은 접속당 생기는 저장공간
     @RequestParam("accountName") String accountName,
     @RequestParam("password") String password){

     UserDto userDto = userService.getUserByAccountNameAndPassword(accountName,password);
     //이 이사람이 누군가에 대한 정보를 저장하기위한 공간이 필요함 -> 세션 활용
     if (userDto!=null) {
         session.setAttribute("sessionUserInfo", userDto); //map형태의 자료구조(저장할수 있는 특수한 자료구조)
         //로그인 성공했으면 session저장공간에다가 값을 저장할 것임
         //인증성공
          return "redirect:/board/mainPage";
     }else{
     //인증 실패
     //로그인 실패 하면 세션 값에다 저장 안 함!
     return "user/loginFail"; //html 파일을 보여줄것
     }
}
  • 파라미터를 받을 때 accountName,password가 날라옴, 파라미터 따로 받을 것임!
  • 단일값만 따로따로 받고싶을 땐 - > @RequestParam 활용
  • 정확한 값을 넣어서 맵핑 해줘야함 ex) @RequestParam("password")
  •  객체를 받을 땐 ModelAttribute

redirect

  • 리턴타입이 String일때 두가지 옵션이 있음
  • 그냥 html(타임리프)반환
  • redirect문자열로 시작하는 것은 웹브라우저한테 /board/mainPage로 재요청
  • 이때 재요청이 2번 요청됨 순간적으로!!
  • 그냥 문구페이지만 보이고 싶으면 html을 하면 되는데 페이지자체를 보이고싶으면 redirect활용
  • 쉽게 말해서, 결과의 과정생략임

session 관련은 따로 정리하겠음!

 

 

파라미터 받은 값을 이제 mapper로 통해서 db로 보내줘야함

UserServiceImpl.java

package com.ca.finalproject.user.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ca.finalproject.dto.UserDto;
import com.ca.finalproject.user.mapper.UserSqlMapper;

@Service
public class UserServiceImpl {

@Autowired
private UserSqlMapper userSqlMapper; //interface

public void register(UserDto userDto){
//데이터 인서트하는것을 레포지터리로 받아서 할것임 mybatis를 통해서 쿼리 만들거!
userSqlMapper.createUser(userDto);
}

public UserDto getUserByAccountNameAndPassword(String accountName, String password){
// 쿼리 호출해야함
UserDto userDto = userSqlMapper.findUserByAccountnameAndPassWord(accountName, password); //호출
return userDto;
}
}

아이디와 비번이 틀리면 null값으로 반환

 

UserMapperSql.java : 인터페이스 매퍼

package com.ca.finalproject.user.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.ca.finalproject.dto.UserDto;

@Mapper
public interface UserSqlMapper {
public void createUser(UserDto userDto); //인터페이스 정의
public UserDto findUserByAccountnameAndPassWord(
     @Param("accountName") String accountName, // "xx" 로 하면 그럼 xml에선 #xx로 해야함!
     //단일값일땐 파라미터 붙이기!
     @Param("password") String password);
}
  • createUser(UserDto userDto) 사용자 회원가입 등 insert 쿼리 수행
  • select일때는 특정 값을 리턴하고 그 이외 insert,update, delete는 voidfㅗ 해도 무방!!
  • 파라미터 DTO 그래도 넘김 -> xml에서 #{accountName}등 으로 접근 가능
  • 주의 : DTO 객체 하나 넘길 땐 @Param 필요 없음
  • 두개 이상 파라미터 사용시 @Param("name") 반드시 명시
  • XML에서는 #{accountName},#{password}로 사용

📌 MyBatis 규칙 및 팁 정리

항목설명

리턴 타입 SELECT: 객체나 리스트INSERT/UPDATE/DELETE: void, int 가능
파라미터 하나 (예: DTO) @Param 없이 사용 가능 → #{필드명}
파라미터 두 개 이상 반드시 각각에 @Param("이름") 지정해야 함
XML 쿼리에서 사용법 @Param("xxx") → XML에선 #{xxx} 로 접근
내부 처리 방식 MyBatis는 내부적으로 Map으로 파라미터를 묶음
DTO 파라미터 XML에서는 #{필드명} 으로 접근, 파라미터 이름 필요 없음

 

mainPage.html

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<!-- 타임리프를 알리는코드임 -->
<!-- 동적으로 html파일을 실행하기 위한 코딩
thymeleaf가 코드를 동적으로 html실행
-->
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판</title>
</head>
<body>
<!-- 둘중에 하나만 나와야함 if문 -->
<!-- th : thymeleaf 속성 -->
<div th:if="${session.sessionUserInfo}">
<!-- 세션에 저장된 메모리 -->
<span th:text="${session.sessionUserInfo.nickname}"></span>님 환영합니다.
<!-- nickname은 객터로 호출 -->
<a href="/user/logoutProcess">로그아웃</a>
</div>
<div th:unless="${session.sessionUserInfo==null}">
비회원입니다.
<a href="/user/loginPage">로그인</a></div>
<!-- 상대경로 잘 하기...!!! -->
</body>
</html>
  • th 는 thymeleaf속성임
  • thymeleaf는 HTML 안에 서버 데이터를 넣고, 조건문 등을 처리해서 실행 결과를 만들어 주는 도구
  • ${session.sessionuserInfo}가 존재하면 로그인한 상태
  • th:text 실제 닉네임 문자열이 HTML에 들어감(XSS 방지도 자동 처리)

 

코드를 실행할 땐 bootrun으로 실행하는게 정석!

BUT, 한줄 쓰고 저장하고 실행시키는게 안됨!

그래서 그냥 f5기능 활용 -> 각자 코드

 

▼ build.gradle>dependencies

developmentOnly 'org.springframework.boot:spring-boot-devtools'

컨트롤 에스 누르면 자동으로 리로드 되는 코드

 

오류에 templete~ 나오면 html보기

 

 

'중앙정보기술인재개발원 > Spring' 카테고리의 다른 글

[Spring] | 세션,쿠키,Session,Cookie  (0) 2025.05.02
[Spring] final project_4  (0) 2025.05.02
[Spring] | final project_3  (1) 2025.05.01
[Spring] | final project_1  (0) 2025.04.28
[Spring] 개발 환경 셋팅  (0) 2025.04.24