게시판 프로젝트-3

이호영·2022년 8월 6일
1

board project

목록 보기
3/7

DB에 데이터 넣기

application properties의 ddl-auto를 update로 변경
controller 패키지를 생성하고 RestController를 생성한다.

UserRepository

public interface UserRepository extends JpaRepository<User, Integer> {
}

JpaRepository는 spring data jpa에서 제공하며 이를 상속 받아 다양한 기능을 사용 가능 하다. 주요 기능을 알아보면

  1. save : 레코드 저장 (insert, update)
  2. findOne : pk로 레코드 한 건 조회
  3. findAll : 전체 레코드 불러오기, 정렬, 페이징 처리
  4. count : 레코드 개수 출력
  5. delete : 레코드 삭제

RestController

@org.springframework.web.bind.annotation.RestController
@RequestMapping("/test")
public class RestController {

    @Autowired
    private UserRepository userRepository;


    @ApiOperation(value = "회원가입")
    @PostMapping("/join")
    public String join(@RequestBody User user){
        user.setRole(RoleType.USER);
        userRepository.save(user);
		return user.getUsername()+"님! 회원가입을 환영합니다";
    }

Test는 talend API를 이용한다.


데이터 조회

RestController에 추가되는 코드이다.

ID를 이용하여 한건 조회

	@GetMapping("user/{id}")
	public Optional<User> userDetail(@PathVariable int id) {	
		Optional<User> result = userRepository.findById(id); // Null safety
		
		return result;
	}

이 코드를 사용하여 http://localhost:8812/board/test/user/4 를 talend api로 보내면 null이 반환된다.

null 대신에 다른 값을 보내기

  @ApiOperation(value = "유저 조회")
    @GetMapping("/user/{id}")
    public User UserDetail(@PathVariable int id){
        User user = userRepository.findById(id).orElseThrow(() ->
                new IllegalArgumentException("id가 "+id+"인 사용자는 존재하지 않습니다."));

        return user;

위 코드로 변경 후 시도하면 null 대신 내가 입력한 메시지로 출력된다.

모든 데이터 조회

List 형식과 page 형식 두가지 형태로 조회 해보자

페이징 기법

  • 수 많은 자료를 일정 크기로 나누어서 나누어진 하나하나의 집단에 페이지 번호를 부여하는 방식
  • 정해진 개수와 원하는 영역의 게시판 데이터를 불러오고 출력하여 '가독성'의 문제와 '자원 낭비' 문제점을 보완해주는 기법
  • @PageableDefault

size : 한 페이지에 출력될 객체 수
sort : 정렬 기준 컬럼
direction : 정렬순서 (내림차순, 오름차순)

List

@GetMapping("/user/list")
    public List<User> userList() {
        return userRepository.findAll();
    }

page

 @GetMapping("/user/page")
    public Page<User> pageList(@PageableDefault(size = 2, sort = "id",
            direction = Sort.Direction.DESC) Pageable pageable) {
        Page<User> userPage = userRepository.findAll(pageable);
        return userPage;
    }

page에서 호영이 조회 되지 않는 이유는 size가 2 정렬 기준 DESC이므로 id가 1인 호영이 잘렸다.
size를 3으로 늘리거나 정렬 기준을 ASC로 변경하면 조회가 된다.
단, size 2 정렬 기준 ASC는 호이가 빠진다.

데이터 수정

 @ApiOperation(value = "유저 업데이트")
    @Transactional
    @PutMapping("/user/{id}")
    public User updateUser(@PathVariable int id, @RequestBody User reqUser) {

        User user = userRepository.findById(id).orElseThrow(() -> { // 영속성 컨텍스트에 있는 객체 들고오는 것
            return new IllegalArgumentException(id + "에 해당하는 유저는 존재하지 않습니다.");
        });

        user.setPassword(reqUser.getPassword());
        user.setEmail(reqUser.getEmail());

        return user;
    }

@Transactional

  • @Transactional 어노테이션을 클래스나 메서드에 붙여줄 경우 해당 범위 내 메서드가 트랜잭션이 되도록 해주며 스프링은 해당 메서드에 대한 프록시를 만든다.
    트랜잭션은 트랜잭션의 시작과 연산 종료시의 커밋 과정이 필요하므로
    프록시를 생성해 해당 메서드의 앞 뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.
    위 코드를 보면 별도로 save() 메소드를 사용하지 않았다.
    @Transactional 어노테이션을 붙였기 때문에 자동으로 update 처리가 된다. (더티 체킹 개념)
    request로 CRUD 요청을 받은 컨트롤러에서 User 객체가 생성되고
    영속성 컨텍스트의 1차 캐시에 담기고(영속화) DB의 User 테이블에 담긴다.
    영속화 되어있는 객체를 들고올 수 있다.

데이터 삭제

    @ApiOperation(value = "유저 삭제")
    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable int id) {

        try {
            userRepository.deleteById(id);
        } catch (Exception e) {
            return id + "에 해당하는 유저는 존재하지 않습니다.";
        }
        return id+"님의 탈퇴가 완료되었습니다.";
    }

0개의 댓글