📌[Spring Boot] TodoList(1)-Mybatis 연동 및 회원가입 기능 구현
저번에 포스팅한 회원가입을 통해 얻은 데이터를 저장하여 로그인 기능과 회원별 TodoList를 구현하고자 한다.
📌mapper.xml
<select id="loginMember" resultType="com.example.todolist.dto.MemberDTO">
SELECT
firstName
,phone
,email
,password
,gender
FROM member
where email = #{email}
and password = #{password}
</select>
email과 password값을 인자로 받아 DB에 해당 조건을 만족하는 데이터를 MemberDTO에 담아 반환하도록 하였다.
XML파일에 SQL query를 작성하면서 여러 조심해야 할 점이 있는데 이번 부분을 구현하면서 많은 오류를 마주했다😢
<select id="loginMember" resultType="com.example.todolist.dto.MemberDTO">
SELECT (firstName,phone,email,password,gender)
FROM member
where email = #{email}
and password = #{password}
</select>
해당 쿼리는 위의 쿼리와 내용은 동일하지만 오류를 초래한다. 줄바꿈이 문법에 많은 영향을 끼칠 줄은 상상도 못했다.
뿐만 아니라 때로는 괄호의 유무에 따라 SQL 오류를 발생시키기도 한다.
이는 XML에 많은 쿼리를 작성하면서 올바른 작성법에 대해 공부해나가야겠다는 생각이 들었다.🤦
📌mapper.java
public MemberDTO loginMember(String email, String password);
📌repository.java
public MemberDTO loginMember(String email, String password) { return mapper.loginMember(email, password);}
📌service.java
public MemberDTO loginMember(String email, String password) { return mr.loginMember(email,password);}
📌controller.java
@PostMapping("/login")
public String login(String email, String password, HttpSession session){
MemberDTO loginMember = ms.loginMember(email, password);
if(loginMember!=null){
session.setAttribute("email", email);
return "index";
}
return "login";
}
}
email과 password를 인자로 받아 일치하는 데이터를 MemberDTO 모델에 반환한다.
반환된 모델이 Null 값이면 존재하지 않는 회원이기 때문에 다시 로그인을 시도하도록 login page를 반환한다.
반환된 모델이 Null이 아니면 session에 email을 저장하고 index page로 반환한다.
📌Member Table 생성
CREATE TABLE todolist (
id INT NOT NULL auto_increment primary key,
todo VARCHAR(30) NOT NULL,
indate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
user_id varchar(30) not null,
foreign key (user_id) references member(email)
);
자동으로 저장되는 id
값과 todo,indate, user_id
를 가지고 있는 테이블을 생성하였다.
로그인한 회원만 접근할 수 있도록 user_id값을 저장하여 세션값과 비교하는 과정
을 거칠 것이다.
📌mapper.xml
<insert id="insertTodo" parameterType="String" >
INSERT INTO todolist (todo, user_id) values (#{todo}, #{user_id})
</insert>
<select id="selectTodo" parameterType="String" resultType="String">
SELECT todo from todolist where user_id = #{user_id}
</select>
<delete id="deleteTodo" parameterType="String">
DELETE FROM todolist where (todo) = (#{todo})
</delete>
✔insert
문은 입력받은 todo를 테이블에 저장하는 쿼리이다.
✔select
문은 멤버의 todo를 모두 출력하기 위한 쿼리이다.
✔delete
문은 수행한 todo를 삭제하기 위한 쿼리이다.
📌repository.java
@Repository
public class TodoListRepository {
@Autowired
TodoListMapper tm;
public int insertTodo(String todo,String user_id){
return tm.insertTodo(todo,user_id);
}
public ArrayList<String> selectTodo(String user_id){
return tm.selectTodo(user_id);
}
public int deleteTodo(String todo){ return tm.deleteTodo(todo);}
}
📌service.java
@Service
public class TodoListService {
@Autowired
TodoListRepository tr;
public int insertTodo(String todo,String user_id){
return tr.insertTodo(todo,user_id);
}
public ArrayList<String> selectTodo(String user_id){
return tr.selectTodo(user_id);
}
public int deleteTodo(String todo){return tr.deleteTodo(todo);}
}
📌controller.java
@RestController
public class TodoListController {
@Autowired
TodoListService ts;
@GetMapping("/list")
public ArrayList<String> displayList(HttpSession session){
return ts.selectTodo((String)session.getAttribute("email"));
}
@GetMapping("/receiveList")
public ArrayList<String> insertList(String todo ,HttpSession session){
ArrayList<String>list = ts.selectTodo((String)session.getAttribute("email"));
if(!list.contains(todo)){
ts.insertTodo(todo,(String)session.getAttribute("email"));
}
return displayList(session);
}
@GetMapping("/deleteList")
public ArrayList<String> deleteList(String todo,HttpSession session){
int id = Integer.parseInt(todo);
ts.deleteTodo(ts.selectTodo((String)session.getAttribute("email")).get(id));
return ts.selectTodo((String)session.getAttribute("email"));
}
}
✔displayList()
: session에 저장된 email값을 인자로 받아 select문을 수행하여 ArrayList에 담아 출력하는 메서드이다.
✔insertList()
: todo를 받아서 session에 저장된 email을 찾아 해당 멤버의 데이터를 저장하는 메서드이다.
✔deleteList()
: todo를 받아서 session에 저장된 email를 찾아 해당 멤버의 데이터를 삭제하는 메서드이다.
❗Todo를 삭제하는 부분의 html을 살펴보면 출력하는 ArrayList의 index를 인자로 전달한다. 하지만 url로 전달되는 인자는 String
으로 넘어오기 때문에 받은 인자를 Integer
로 변환하는 과정이 필요했고, index값으로 ArrayList의 Todo를 받아 삭제하는 과정이 제일 복잡했다.❗
마무리
Spring Boot를 처음 시작하며 Page 이동을 하고 데이터베이스를 연동하여 회원가입, 로그인, TodoList까지 구현해보았다.
mapper부터 repository, service, controller를 연결하는 부분이 익숙해졌고, SQL문법을 다시 상기시키는 유익한 시간이었다.
또한, html 파일을 들여다보며 어떻게 데이터를 주고 받는지 확인할 수 있었고 직접 눈으로 결과들을 확인해가며 재밌게 실습했던 것 같다😜