TodoList 만들기 1

2024. 7. 17. 18:36Springboot-React

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="jdbcTypeForNull" value="NULL"/>
		<setting name="mapUnderscoreToCamelCase" value="true" />
	</settings>
</configuration>

 

** </setting name="jdbctypefornull" value="null">
Mybatis에서 null값을 처리하는 방법을 지정하는 설정
- DB나 JAVA에서 가져오는 값이 null일 때 어떻게 처리할 것인가

value = Null이라고 작성하면 Null이 들어가고
value = VARCHAR2나 int 특정값으로 null을 db에 전달하겠다는 설정

 

todo-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0/EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="todo.mapper.TodoMapper">
	<select id="idCheck">
		SELECT COUNT(*) FROM TODO_MEMBER WHERE ID = #{id}
	</select>
	
	<insert id="signup">
		INSERT INTO TODO_MEMBER VALUES(SEQ_TODO_MEMBER_NO.NEXTVAL, #{id}, #{pw}, #{name})
	</insert>
	
	<select id="login" resultType="TodoMember">
		SELECT * FROM TODO_MEMBER WHERE ID = #{id} AND PW = #{pw}
	</select>
	
	<!-- DB에 있는 TODO 테이블에서 해당 번호의 할 일이 완료 됐는지 isDone으로 완료 여부 수정 -->
	<update id="update">
		UPDATE TODO SET IS_DONE = #{isDone} WHERE TODO_NO = ${todoNo}
	</update>

	<delete id="delete">
		DELETE FROM TODO WHERE TODO_NO = ${todoNo}
	</delete>
	
	<!-- 할 일 추가 -->
	<insert id="insert" useGeneratedKeys="true">
		<selectKey order="BEFORE" keyProperty="todoNo" resultType="_int">
			SELECT SEQ_TODO_NO.NEXTVAL FROM DUAL
		</selectKey>
		INSERT INTO TODO VALUES(${todoNo}, #{title}, #default, #{todoMemberNo)
	</insert>
</mapper>

 


** 할 일 추가
insert 특정 값을 DB에 넣기 전에 해당하는 값을 미리 가져와서 확인

useGeneratedKeys : 자동으로 생성된 키를 사용하도록 설정
selectKey order="BEFORE" insert 문이 실행되기 전에 select 문을 실행하기위한 설정
resultType="_int" = resultType="int" : int 타입으로 지정

SEQ_TODO_NO.NEXTVAL : 특정 번호를 작성할 때 다수가 동시에 접속해 회원가입을 동시에 진행할 때 각 고객이 회원가입 완료 버튼을 누르면 해당 번호를 사용해도 되는지 확인한 후 insert를 진행

keyProperty : 선택된 값이 사용될 속성

위 조회가 종료된 다음에 insert 진행

#{} : 매핑된 객체에서 title 속성 값을 가져와 사용
default 기본 값 사용
${} selectKey에서 선택된 todoNo 값을 사용

#{}, ${} 차이
#{} : 사용자 입력 값을 안전하게 처리해야하는 경우. 동적 쿼리를 생성하지 않아도 되는 경우. sql 인젝션 공격 방지

${} : 동적 테이블 이름이나 컬럼 이름을 사용해야하는 경우sql 특정 구문을 동적으로 변경해야하는 경우
        입력한 값이 신뢰할 수 있고 sql 인젝션 위험이 없는 경우에 사용

* 인젝션(injection) : sql을 들어가기 전에 조작된 쿼리를 삽입

order="BEFORE" -> insert 하기 전에 조회하는 것
order="AFTER" -> insert 한 다음에 결과를 보는 것

 

TodoMapper

package todo.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import todo.dto.Todo;
import todo.dto.TodoMember;

@Mapper
public interface TodoMapper {
	
	int idCheck(String id);
	int signup(TodoMember member);
	TodoMember login(TodoMember member);
	List<Todo> selectTodoList(int TodoMemberNo);
	int insert(Todo member);
	int update(Todo member);
	int delete(int TodoNo);
}

 

TodoService / TodoServiceImpl

package todo.service;

import java.util.Map;

import todo.dto.Todo;
import todo.dto.TodoMember;

public interface TodoService {

	int idCheck(String id);
	int signup(TodoMember member);
	Map<String, Object> login(TodoMember member);
	int insert(Todo member);
	int update(Todo member);
	int delete(int TodoNo);
}

==============================================================================

package todo.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import todo.dto.Todo;
import todo.dto.TodoMember;
import todo.mapper.TodoMapper;

@Service
public class TodoServiceImpl implements TodoService{

	@Autowired
	private TodoMapper mapper;
	
	@Override
	public int idCheck(String id) {
		return mapper.idCheck(id);
	}
	
	@Override
	public int signup(TodoMember member) {
		return mapper.signup(member);
	}
	
	@Override
	public Map<String, Object> login(TodoMember member){
		TodoMember loginMember = mapper.login(member);
		Map<String, Object> map = new HashMap<>();
		
		map.put("loginMember", loginMember);
		
		//로그인한 멤버 정보가 조회되면 그 멤버가 작성한 todoList를 보여줌
		if(loginMember != null) {
			List<Todo> todoList = mapper.selectTodoList(loginMember.getTodoMemberNo());
			
			//Map 형태로 프론트엔드에 전달. todoList라는 이름(key)으로 todoList 내용(value)전달
			map.put("todoList", todoList);
		}
		return map;
	}
	
	@Override
	public int insert(Todo todo) {
		int result = mapper.insert(todo);
		
		//결과가 참이면 todo.getTodoNo()->할 일 번호 가져와서 넣어줌
		//거짓일 경우 0을 전달
		return result > 0 ? todo.getTodoNo() : 0;
	}
	@Override
	public int update(Todo todo) {
		return mapper.update(todo);
	}
	@Override
	public int delete(int TodoNo) {
		return mapper.delete(TodoNo);
	}
	
	//react에서 map(key: value) 형태로 이름(key)과 키에 해당하는 값(value)이 들어옴
}

 

TodoController

package todo.controller;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import todo.dto.Todo;
import todo.dto.TodoMember;
import todo.service.TodoService;

@RestController
public class TodoController {

	@Autowired
	private TodoService service;
	
	//아이디 중복 검사
	//중복시 1, 아닐 시 0 반환
	//select count 했을 때 존재하면 1로 넘어오고 없으면 0으로 넘어옴
	@GetMapping("/idCheck")
	public int idCheck(@RequestParam("id") String id) {
		return service.idCheck(id);
	}
	
	//회원 가입
	//성공시 1, 실패시 0 반환
	@PostMapping("/signup")
	public int signup(@RequestBody TodoMember member) {
		return service.signup(member);
	}
	
	//로그인
	//성공시 회원 정보 /todoList, 실패 null
	@PostMapping("/login")
	public Map<String, Object> login(@RequestBody TodoMember member){
		return service.login(member);
	}
	
	//할 일 추가
	//@Param todo
	//return 성공시 1 : 실패시 0
	@PostMapping("/todo")
	public int insert(@RequestBody Todo todo) {
		return service.insert(todo);
	}
	
	//할 일 수정
	//Param todo
	//return 성공시 1 : 실패시 0
	//update 수정 -> @PutMapping
	//PostMapping을 써도 됨
	@PutMapping("/todo")
	public int update(@RequestBody Todo todo) {
		return service.update(todo);
	}
	
	//할 일 삭제
	//Param todoNo
	//return 성공시 1 : 실패시 0
	//delete 삭제 -> @DeleteMapping
	//PostMapping을 써도 됨
	@DeleteMapping("/todo")
	public int delete(@RequestBody int todoNo) {
		return service.delete(todoNo);
	}
	
	@GetMapping("/test")
	public int test() {
		return 100;
	}

}

'Springboot-React' 카테고리의 다른 글

tosspay구현하기 3 (springboot)  (0) 2024.07.24
tosspay구현하기 2 (springboot)  (0) 2024.07.24
tosspay 구현하기 1 (react)  (0) 2024.07.24
TodoList 만들기 3  (0) 2024.07.18
TodoList 만들기 2  (0) 2024.07.18