본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 71일차 (1) (스프링 기본적인 CRUD 관리, Modal)

프로젝트의 구성

[각 영역의 네이밍 규칙]

1. xxxController : 스프링 MVC에서 동작하는 Controller 클래스

2. xxxService, xxxServicelmpl

1) xxxService : 비즈니스 영역을 담당하는 인터페이스

2) xxxServicelmpl : 인터페이스를 구현한 클래스

3. xxxDAO, xxxRepository

1) DAO(Data-Access-Object)나 Repository(저장소)라는 이름으로 영역을 따로 구성하는 것이 보편적

2) 예제에서는 MyBatis의 Mapper 인터페이스를 활용

4. VO, DTO

1) VO : ReadOnly의 목적이 강하고, 데이터 자체도 불변하게 설계

2) DTO : 데이터 수집의 용도

[프로젝트 패키지의 구성]

프로젝트 패키지의 구성 ( 패키지의 이름으로 패키지 해당 속성을 유추할 수 있다.)

게시물의 CRUD 흐름, 이것을 스프링으로 해보는 겁니다.

첨부파일

pom.xml.txt

 파일 다운로드

기본적인 게시물의 CRUD 흐름을 위한 pom.xml 을 첨부합니다. 해당 내용을 복사해서 쓰시면 되겠습니다.

스프링 버전 변경 5.0.7

자바 버전 변경 1.8

라이브러리 추가

- 스프링 관련 : spring-tx, spring-jdbc, spring-test

- MyBatis 관련 : HikariCP, MyBatis, mybatis-spring, Log4jdbc

- jUnit 변경 (4.7 -> 4.12), Lombok 추가

- Servlet 버전 변경 : 2.5 -> 3.10

mysql 라이브러리 추가 : mysql-connector-java(8.0.13)

관련으로 수정한 것이고 다 수정 후에 프로젝트 우클릭 후 Maven > Update project 를 추가합니다.

[기본적인 게시물 CRUD 시작]

1. 테이블을 생성 및 더미 객체를 주입합니다. (mysql)

테이블 생성 및 더미객체 주입

https://blog.naver.com/tnwnsrla/222388764368

69일차에서 했었던, root-context 에 db가 연결되어 있어야 합니다!

1) src/main/resources/log4jdbc.log4j2.properties 파일을 추가합니다.

jdbc의 로그를 보기 위해서입니다.

2) src/test/java/org/zerock/persistence 밑에 DataSourceTests.java, JDBCTests.java를

추가하여 데이터베이스가 잘 설정되었는지 테스트합니다.

JDBCTests.java

DataSourceTests.java

[기본적인 게시물 CRUD 시작 -> 영속/비지니스 계층의 CRUD 구현]

1. 영속(Persistence) 계층의 처리

1) 테이블을 반영하는 VO(Value Object) 클래스의 생성

(1) BoardVO 클래스를 생성합니다.

src/main/java org.zerock.domain.BoardVO.java

2) MyBatis의 Mapper 인터페이스의 작성

(1) Mapper 인터페이스

ㄱ) root-context.xml 수정사항

root-context.xml 에 <mybatis-spring:scan base-package="org.zerock.mapper"/> 를 추가합니다.

위 사진에서는 추가가 되어 있을겁니다.(완성본상태에서 과정을 다시 밟아가는 중입니다.)

해당 문구는 mybatis 가 해당 패키지를 찾을 수 있게 해주는 것 같습니다.

ㄴ) org.zerock.mapper.BoardMapper.java (인터페이스)생성

src/main/java 에 org.zerock.mapper.BoardMapper.java(인터페이스)를 생성한 후 빨간 네모칸 부분만 입력합니다.

자바 인터페이스에서 SQL 을 작성하여 실행하는 방법으로 첫번째 테스트를 진행할 것입니다.

ㄷ) src/test/java 에 org.zerock.Mapper.BoardMapperTests.java 를 생성합니다.

BoardMapperTests.java 빨간 부분만 입력 후 테스트를 진행합니다.

콘솔창에 DB에 저장했던 데이터들이 나오면 정상입니다.

3) src/main/resources/org/zerock/mapper/BoardMapper.XML 파일을 작성합니다.

src/main/resources/org/zerock/mapper/BoardMapper.XML 쿼리문에서 부등호처리를 하기 위해서 CDATA를 입력해주어야 합니다.

네모칸 밖 부분은 작성하지 마세요. 아직 진행단계가 아닙니다.

https://epthffh.tistory.com/entry/Mybatis-%EC%97%90%EC%84%9C-CDATA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

Mybatis 에서 CDATA 사용하기

마이바티스에서는 CDATA 구문을 많이 씁니다 이유는 쿼리문에 문자열 비교연산자나 부등호를 처리할 때가있습니다 그러면 < 와 같은 기호를 괄호인지 아니면 비교연산자 인지 확인이 되지않아요 이외에도 특수문자..

epthffh.tistory.com

4) org.zerock.mapper.BoardMapper.java (인터페이스)를 다음과 같이 수정합니다.

BoardMapper.java xml에서 sql 구문을 작성하였으므로 sql 구문을 삭제하고 해당 메소드만 살립니다. 빨간 밑줄만 작성하세요!

5) BoardMapperTests.java 에서 다시 실행해봅니다.

BoardMapperTests.java 의 Console 을 보면 잘 동작함을 확인할 수 있습니다.

인터페이스에서는 메소드만 제공하고 BoardMapper.xml 에서 해당 SQL 을 작성하였기 때문에 가능한 것입니다.

[영속 영역의 CRUD 구현 - 게시물 등록(CREATE)]

1. 생성된 게시물의 번호를 사용하는지 여부에 따라 구분합니다.

1) insert 만 처리되고 생성된 PK(기본키) 값을 알 필요가 없는 경우

public void insert(BoardVO board);

2) insert 문이 실행되고, 생성된 PK (기본키) 값을 알아야 하는 경우 (selectKey 사용 )

public void insertSelectKey(BoardVO board);

ㄱ) 이런 경우는 보통 첨부파일 정보저장을 할 때 사용한다고 합니다. 예를 들어, 게시글 등록한 사람이

게시글번호(bno)가 1이고 같이 첨부파일을 등록할 경우, 첨부파일 DB에 bno를 selectKey로

가져오는 것입니다. 즉 게시글 Table 과 첨부파일 Table 이 따로 있는 경우에 게시글 Table 에서

첨부파일 Table 에 대한 정보를 가져오거나 (반대의 경우) 할 때 사용하는 것 같습니다.

3) BoardMapper.java에 insert(), insertSelectKey()를 추가합니다.

BoardMapper.java

4) BoardMapper.xml 에 BoardMapper.java의 insert(), insertSelectKey() 관련 내용을 추가합니다.

(1) <selectKey> 는 SQL 이 실행된 후에 별도의 PK 값을 얻기 위해서 사용하는 것입니다.

order='after'를 이용해서 insert 구문이 실행된 후에 호출하고

keyProperty를 통해 BoardVO의 bno값으로 세팅합니다.

BoardMapper.xml

5) BoardMapperTests.java에 testInsert(), testInsertSelectKey()를 추가하여 테스트합니다.

(1) testInsert()를 했을 때, tbl_board 테이블에 새로운 데이터가 insert 되는 것을 확인할 수 있습니다.

또한, Console 에서는 bno 값을 확인할 수 없다는 것을 볼 수 있습니다.

(2) testInsertSelectKey()도 동일하게 데이터가 추가됨을 확인할 수 있습니다.

하지만 Console(자바)에서 bno값을 확인 할 수 있습니다.

BoardMapperTests.java @Test 의 주석표시는 지우셔야 실행이 됩니다.

testInsert() 실행결과

testInsertSelectKey() 실행결과