2020. 12. 22. 10:23ㆍ프로젝트/Salle(살래) 중고거래 웹
빈대잡다 초가상간 태운 날. 판매하기 페이지 상품등록이 mapper.xml에서 INSERT문이 정상적으로 작동하는지 Test해보려고 Junit를 사용하다가 pom.xml - h2.database 오류때문에 프로젝트 전체에 오류가 생겨버렸다.
요약
-
TODO - sell한 상품이 있으면 내상점에도 추가해주는 기능, 상품 등록 시 product DB에 추가되는 sql문
-
DB 연동 필요
-
Member ID, Email(사용자 Session)을 INSERT문에 삽입
TIL
-
SQL
-
h2 - TIMESTAMP WITH ZONE타입의 데이터를 입력할 때 parsetimedate을 사용하면 원하는 포맷에 맞게 시간을 입력할 수 있다.
-
Java
-
ex. Timestamp ts = new Timestamp(localDateTime.now());
-
-
Timestamp : java.util.Date 내 api인데, sql로 시간 데이터 타입을 보낼 때 사용하는 api이다.
-
Junit
-
mock 객체는 테스트를 진행할 때 해당 코드 외의 의존하는 객체를 가짜로 만들어주는 것을 얘기하며 이는 해당 객체에 영향을 주지 않기 위해서 사용된다.
-
MockitoAnnotations.initMocks(this)를 이용하면 Mockito 어노테이션이 선언된 변수들은 객체를 만들어냅니다.
-
-
Mockito Framework는 mock 객체를 만들어주는 프레임워크(참고링크)
진행사항
-
판매상품(product) 등록정보 DB에 저장 - RDBMS
-
등록일 - date TIMESTAMP(9) WITH TIME ZONE
-
(12/21) Timestamp 객체를 만들어주고 객체 매개변수에 LocalDateTime.now()를 입력한다. 그렇게 되면 ISO-8601(국제 시간데이터 표준)에 맞는 데이터가 반환된다.
-
그 데이터를 가지고 sql문에 넣는데, 넣기 전에 parsedatetime("date", "format") 처리를 해줘야 h2 DB에서 인식할 수 있다.
-
Product 변수에 .jsp에서 받는 데이터를 직접 입력한 뒤, reg_date 컬럼 입력이 잘 작동하는지 알아본다.
-
-
이런식으로 xml파일 내 sql문을 작성했는데 인식에 오류가 없는지 구현해봐야 될듯 → 주소나 상품이미지는 100% 구현된 상태가 아니기 때문에 Junit을 활용한 Test로 시도해보기 → ProductService의 registerProduct 메서드는 돌렸을 때 nullpointerexception이 나와서 문제가 있는 걸 파악했는데 어떻게 발생한 것인지는 모르겠음.
-
-
TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP WITH TIME ZONE
-
H2에선 TIMESTAMP 디폴트로 자동 현재 시간 update 기능을 제공하지 않고 있음 그래서 trigger 기능을 활용해 직접 만들어 써야함(참고링크)
-
(12/19) TimeStamp로 현재 시간 Product(Vo)의 setPr_reg_date에 저장 하기로 결정
-
INSERT INTO product VALUES(#{email}, parsedatetime(#{pr_reg_date}, "yyyy/MM/DD hh:mm:ss"), #{pr_img}, #{pr_title}, #{pr_category}, #{pr_region}, #{pr_quality}, #{pr_price}, #{pr_detail);
-
상품이미지 - imgPath VARCHAR(500) *VARCHAR2와 차이는 없지만 추후 oracle에서 VARCHAR는 다른 용도로 쓸 수 있다고 한 적이 있기 때문에 2 사용을 권장
-
DB에 주소값만 저장하고 실제 이미지는 Server에 저장하는 방식이 보편적임
-
내 건 로컬서버를 이용한 Demo 프로젝트라서 등록된 이미지 파일은 로컬폴더로 저장
-
-
DB 컬럼
-
SellProductController
-
GET은 화면만 띄워주고, POST는 ProductService를 통해 DB에 정보 저장
-
(12/19) session.attribute의 email 받아서 Product(Vo) setEmail에 저장
-
SellProductValidation
-
모든 정보 입력하지 않았을 때 발생하는 Exception 추가
-
ProductService
-
.jsp 화면에서 받은 정보들을 Product 객체로 받아서 Mapper에 SQL로 넘겨줌
-
(12/19) TimeStamp로 현재 시간 Product(Vo)의 setPr_reg_date에 저장
-
Product(VO)
-
DB 테이블 정보와 동일한 변수들 저장 → Getter/setter 생성
-
ProductMapper(xml)
-
(12/19) Product Vo에 변수로 추가하자. 그럼 .jsp에서 어떻게 추가해줄 건데?... → xml문으로 바로 보내줄 수 있는 방법없을까? 'mybatis xml파일 INSERT문 session 변수 전달방법'
-
-
Insert문으로 DB 동작 →parameterType은 Product 객체
-
id, email은 session으로부터 어떻게 받아줄지?
이슈
-
정확히 Autowired를 언제쓰는지 잘 모른다. 언제써야하고 어떤 역할을 하는지 찾아서 TIL에 정리하기
-
상품등록 시 저장되는 PR_REG_DATE를 spring에서 넣어주기 위해 org.h2.api를 import해서 Timestamp 인스턴스로 받으려 했지만 되지 않았다. dependecy는 pom에 추가했는데 원인을 모르겠다.
-
그래서 찾은 결과 sql문에 포맷과 시간값을 parsetime이란 메서드를 통해 묶어줄 수 있다는 것을 발견했다. parsetime('2020/12/12...', 'yyyy/MM/DD...')
-
reg_date DB 연동 Junit Test 에러(16:17)
-
@RunWith annotation은 JUnit에 내장된 기본 테스트 러너인 BlockJUnit4ClassRunner 대신에 @RunWith(클래스이름.class)를 이용해 JUnit Test 클래스를 실행하기 위한 Test Runner를 명시적으로 지정할 수 있다. 지정된 클래스를 이용해 테스트 클래스 내의 테스트 메소드들을 수행하도록 지정해주는 annotation이다. 일종의 JUnit 프레임워크의 확장지점이다. 이런 구조를 이용해서 많은 애플리케이션이나 프레임워크가 자신에게 필요한 Test Runner를 직접 만들어 자신만의 고유한 기능을 추가해 테스트를 수행하고 있다. 예를 들면, 스프링 프레임워크에서 제공하는 SpringJUnit4ClassRunner, SpringRunner같은 클래스는 이 확장 기능을 이용한 대표적인 사례 중 하나다.
-
-
mock을 잘못썼나? → MockitoAnnotations.initMocks(this);을 설정해줘야 mock이 객체가 변수화되어 실행된다.
-
delete와 insert를 실행시키고 getCount를 실행시키니까 자꾸 True만 뜬다. 이상하다. 실제로 실행해봐야겠다.
-
@SpringBootTest를 명시해주지 않아서 작동이 제대로 되지 않음 → @RunWith(MockitoJUnitRunner.class)
-
h2 dependency 버전 변동으로 인해 spring이 인식하지 못하는 오류 발생 → DB를 삭제하고 다시 파야된다고 함
-
maven install을 하면 The requested profile "pom.xml" could not be activated because it does not exist 에러가 뜸. run configuration에 들어가서 pox.xml을 지우면 된다고 한다.
-
H2 버그로 의심됨
-
h2-1.4.196 으로 DB를 접근 후 h2-1.4.200으로 다시 접근 시 오류가 발생
-
h2-1.4.200 으로 열기전에 h2-1.4.199로 열면 오류가 발생하지 않음.
-
'프로젝트 > Salle(살래) 중고거래 웹' 카테고리의 다른 글
[Salle] 4. 판매하기 페이지 (5) - 1차 완성 (0) | 2020.12.23 |
---|---|
[Salle] 4. 판매하기 페이지 (4) - img파일 DB 저장 (0) | 2020.12.22 |
[Salle] 4. 판매하기 페이지 (3) 이미지 첨부파일 여러개 업로드 (0) | 2020.12.18 |
[Salle] 4. 판매하기 페이지 (2) - 거래지역(행안부 팝업주소 API) (0) | 2020.12.18 |
[Salle] 2-2. 로그아웃 버튼과 기능구현 (0) | 2020.12.15 |