2024. 7. 17. 18:36ㆍSpringboot-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 |