스프링 개인 과제 CRUD 게시판 프로젝트 마무리!
기본적으로 3Layer-Archetecture로 Controller-Service-Repository 구조로 설계했다.
Restful API 설계를 위해 Controller 클래스에서는 각 기능에 맞게 API 메서드를 사용했다. 게시글 작성에는 Post 메서드, 게시글조회 /전체 게시글 목록 조회 에는 Get 메서드, 게시글 수정에는 Put 메서드, 게시글 삭제에는 Delete 메서드를 사용했다.
Repository 는 jdbcTemplate을 이용해서 사용했다. 여기서 조금 아쉬운게 강의를 두시간만 더 들었다면 jdbc가 아닌 JPA를 이용하여 설계 했을 텐데 jdbcTemplate 이용해서 설계를 하려니 조금 복잡하고 코드도 어려웠다. 아무튼 DB에 저장을 할 때는 jdbcTemplate의 update 메서드를 이용했다. 이때 Entity의 id를 초기화 하기 위해 KeyHolder클래스를 이용해 현재 DB에 저장된 id의 값 중 제일 큰 값을 얻어와 id를 초기화 시켜주는 방식으로 사용했다. 또 게시글 조회에는 query 메서드를 사용했는데, 한개의 데이터를 가져올 때는 queryForObject메서드를 이용했다. 게시글 목록을 조회해야할 때는 DB에 저장된 모든 데이터를 불러와야 했기에 query메서드를 이용했다. 이때 첫번재 인자로는 sql문을 넣어주고, 두번째 인자로 RowMapper를 넣어주는데 이때 RowMapper의 mapRow()메서드를 오버라이딩 해줘야 했다. 개념적으로 쉽게 이해하기로는 쿼리를 날려 받아온 데이터를 ResultSet으로 담아둔 후, 담아둔 데이터들을 Entity에 맞게 정보를 초기화 시켜준 후 List로서 반환해주는 메서드인것 같다. 여기에 대해 내가 더 많은 공부를 하지 않는 이유는 앞으로는 JPA를 사용하는 것이 더 편하고, 안전하다고 생각해서 이런게 있다~ 정도로 알고 넘어갔다.
Service 클래스는 주로 Repository의 메서드를 이용하여 조건에 맞는 로직을 사용했다. 가령 게시글을 수정해야 할 때는
클라이언트로부터 메모의 id를 받고, 비밀번호를 받는다. 그 후 Repository에 해당 id의 메모를 찾은 후 메모의 비밀번호와 전달받은 비밀번호가 일치하는지 판단하는 메서드를 만들었다. 이 메서드는 게시글을 수정할 때도, 삭제할 때도 사용했기에 메서드로 구현해서 사용했다. 저번에 튜터님에게 반복해서 사용되는 기능은 메서드로 만들어서 사용하는게 좋은 방향이라고 들어서 그렇게 해봤다.
어제부터 하루종일 매달렸지만 결국 데이터를 받는데 실패했다. Postman을 이용하여 body에 정보를 JSON형식으로 담아 통신을 하려고 했다. 하지만 Service 클래스의 게시글 작성 메서드가 제대로 작동하지 않았다. 실행 시 나오는 오류는 "해당 메서드의 반환값이 NULL이기 때문에 실행될 수 없다."였다. Postman에서 POST 메서드를 이용해서 입력을 잘해줬는데도 불구하고 NULL이 전해져서 구현에 실패했다. 게시글을 작성해야 DB에 값이 들어가고, 그 후 다른 기능을 테스트 해볼 수 있을텐데 첫 진입로가 막혀 뒤의 기능들을 테스트 해보지 못했다. 첫 스프링 프로젝트를 실패로 마무리 지어 너무 아쉽다.
그래도 이번 프로젝트를 진행하면서 내가 스프링에 대해 몰랐던 부분들을 더 확실히 알 수 있었다. 강의에서 들었던 개념을 내가 구현을 해보면서 스프링 부트가 이런 것들을 제공하는구나, 이걸 자바로만 구현한다면 정말 많은 시간과 어려운 문법을 요했겠다. 이런 생각이 들었다. 스프링이 어떻게 좋은 프레임워크인지에 대해서는 아직 명확히 와닿지는 않지만, 분명한건 내가 필요한 개념과 기능들이 이미 존재하고, 내가 그것들을 이해해서 가져다 쓸 수 있다는 것만을로도 충분한 편의성을 제공한다고 생각했다.
오늘은 과제제출을 하고 강의를 들었다. 위에서 말했듯 오늘은 JPA와 Entity에 대해 배웠다. 내가 사용했던 jdbc의 방식은 상당히 불편하고, 변경에 취약하다. 만약 DB와 Entity에 새로운 속성을 추가해야 한다면, 수정해야 할 것이 너무 많아진다. SQL을 직접 작성하여 테이블의 컬럼을 바꿔줘야 하고, Entity에도 필드값을 추가하며, 각종 메서드에 해당 속성을 새로 받는 기능을 추가해줘야 한다. 그래서 나온 개념이 ORM(Object-Relational Mapping) 객체를 DB에 매칭시켜주는 방식이다. JPA는 ORM의 표준 명세이다. 즉 정답은 아니고 가장 널리 많이 쓰이는 방식! 그리고 이를 구현한 것이 하이버네이트다.
그리고 그냥 추상적으로 배웠던 Entity에 대해 본격적으로 다루게 됐다.
효율적으로 Entity를 다루기 위해서 Persistance Context방식으로 관리하게 됐다. Persistance Context 방식으로 구현을 하게 되면 더이상 자바에서는 SQL을 이용하여 DB에 접근하지 않아도 된다. 이때 Entity들을 관리하는 Entity Manager를 이용해 DB에 접근하여 데이터를 저장/조회/수정을 하게 된다. 이때 Entity Manager는 EntityManagerFactory에서 관리된다. DB 한개당 EntityManagerFactor은 한개로 EntityManager는 여럿이 존재할 수 있다.
JPA의 트랜잭션. JPA를 이용하여 DB에 접근 할 때는 트랜잭션을 이용하여 접근해 데이터의 무결성과 정합성을 유지한다. 트랜잭션은 한번에 여러개의 SQL을 담아둔다. 그리고 모든 SQL에 오류가 없을때 commit이 호출되면 동시에 sql이 적용된다. 이때 sql중 하나라도 오류가 있다면 모든 변경을 되돌린다. 따라서 DB의 무결성을 유지할 수 있게 된다.