@Document(collection = "boot_order")
mongodb컬렉션 사용시 @Document 꼭 사용 하기!
System.out.println( order.toString() ); // 확인용
확인하면서 진행해야 오류 찾을때 범위가 좁다!
System.out.println( order.toString() );
확인용 대신 사용 => @Slf4j
System.out.println
보다 더 명확한 정보 확인 가능!
만들어진것을 사용하는데 확인해보면 대부분 인터페이스로 되어있다!
@Slf4j
아래와 같이 사용
log.info(order.toString());
log.error(order.toString());
출력결과
2022-08-26 09:29:09.921 INFO 3936 --- [nio-8080-exec-1] com.example.controller.OrderController : Order(no=0, cnt=12, memberid=aaa, itemno=2, regdate=null)
2022-08-26 09:29:09.922 ERROR 3936 --- [nio-8080-exec-1] com.example.controller.OrderController : Order(no=0, cnt=12, memberid=aaa, itemno=2, regdate=null)
@Slf4j
는 시간, 컨트롤러위치 등 System.out.println
보다 자세한 정보를 알 수 있고 보기 쉽다.
=> 자바 클래스 시작은 대문자로! 변수 시작은 소문자로 사용한다.
- 서비스 파일 생성 => 오버라이드 생성되면 이미 정의되었다는것!
서비스에서 MongoTemplate 안쓰고 따로 저장소 따로 분류 하여 생성 => OrderRepository.java 생성
public int insertOrder(Order order) {
try {
// 부족한 항목 채우기
order.setRegdate(new Date());
order.setNo(counterService.generateCounter("SEQ_BOOT_ORDER_NO"));
// 저장소 저장 기능 사용
Order retOrder = oRepository.save(order);
if (retOrder != null) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
oRepository.delete(order);
반환값이 void이기 떄문에 바로 예외처리를 해주어야한다
public int deleteOrder(Order order) {
try {
oRepository.delete(order);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
변경하고자 하는 기본키 정보를 추가하여 저장한다 (마치 덮어쓰기 같이)
upsert
= 정보가 있으면 수정, 없으면 새로 저장
기본키 정보를 기준으로 마치 덮어쓰기 처럼입력(insert)
과수정(update)
된다
그래서 정보 입력시 기본키 정보가 반드시 있어야 한다!
public int updateOrder(Order order) {
try {
order.setRegdate(new Date());
oRepository.save(order);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
save의 반환값
CrudRepository.save(S entity) : S
S = 해당 객체 = order을 의미함
새 패키지(파일) 생성시 application.java 파일에 위치를 적어준다
개발자가 임의로 파일 생성하는것은 개발자 편의이다!
스프링부트는 파일에 따라 분류 하지 못하기 때문에 각 속성별 파일 위치를 지정해주어야 한다.
OrderRepository.java 사용위해
Boot20220824Application.java 에 저장소(JAP, hibernate)의 위치를 지정해준다.
// 컨트롤러, 서비스의 위치
@ComponentScan(basePackages = {"com.example.controller", "com.example.service"} )
// 엔티티의 위치
@EntityScan(basePackages = {"com.example.entity"} )
// 저장소(JAP, hibernate)의 위치
@EnableMongoRepositories(basePackages = {"com.example.repository"})
- OrderRepository.java 생성 후 MongoRepository를
extends
(상속)해준다
=> MongoRepository 를 상속함으로 MongoRepository의 속성을 사용할 수 있다MongoRepository
를ctrl
+클릭
해보면 기본 crud가 작성되어 있는것을 확인 할 수 있으며
아래와 같은 사용 형태 또한 알 수 있다
=> MongoRepository<T,ID> = MongoRepository <엔티티 타입, 엔티티 기본타입> 으로 와야한다- 변수 생성시
findBy변수명GreaterThan
으로 사용하고 변수명은 반드시 대문자를 사용해야한다.- 아래의
findByNoIn
처럼 repository 내의 변수명은 같아도 된다!
=> 왜냐하면 사용시 변수마다 파라미터는 다르기 때문에 변수명 같이 쓸수 있다
변수 사용시 사용하고자 하는 알맞은 파라미터의 변수를 사용한다.
repository / OrderRepository.java
// 결과가 여러개일 수 있으니 List<Order> 사용하기
List<Order> findByCntGreaterThan(long cnt);
service / OrderService.java
// 주문번호가 해당하는 항목만 조회 ex) [1,3,5] => 1,3,5만 꺼내기
public List<Order> findByNoIn(List<Long> no) {
return oRepository.findByNoIn(no);
}
repository / OrderRepository.java
List<Order> findByNoIn(List<Long> no);List<Order> findByNoIn(List<Long> no);
service / OrderService.java
// 주문번호가 해당하는 항목만 조회 ex) [1,3,5] => 1,3,5만 꺼내기
public List<Order> findByNoIn(List<Long> no) {
return oRepository.findByNoIn(no);
}
repository / OrderRepository.java
// List<Long>, Sort.by(DESC, "no")
List<Order> findByNoIn(Collection<Long> no, Sort sort);
service / OrderService.java
public List<Order> selectByNoin(List<Long> no) throws Exception{
Sort sort = Sort.by(Direction.DESC, "no");
return oRepository.findByNoIn(no, sort);
}
repository / OrderRepository.java
// 전체조회 (반환값 = 새로 작성한 인터페이스의 항목)
List<OrderProject> findALLBy();
entity / OrderProject.java
package com.example.entity;
public interface OrderProject {
// private Long no = 0L; // 주문번호, 기본키
Long getNo();
// private Long cnt = 0L; // 주문수량
Long getCnt(); //get+변수명(변수명은 대문자로 시작)
// private String memberid = null; // 외래키 주문자
String getMemberid();
}
- query문 사용하면 메소드명은 중요하지 않다. query 작성문이 더욱 중요함!
=> gte는 이상 gt는 초과 lt 미만 lte 이하- 추가적인 문법은 mongodb 메뉴얼 확인하기
?0
실제로 넘어오는 데이터를 넣어주는 위치
수량이 n보다 큰것 조회
repository / OrderRepository.java
@Query(value = "{cnt : {$gt : ?0}}", sort = "{no : -1}" )
List<Order> getCntGrater( long cnt );
service / OrderService.java
// 수량이 n보다 큰것 조회
public List<Order> selectCntGreaterThan(long cnt) throws Exception {
return oRepository.findByCntGreaterThan(cnt);
}
=> 주문번호가 일치하는 것 조회(하나밖에 없을것)
repository / OrderRepository.java
@Query(value = "{ no : 0? }")//native로 바꿈
Order getFindNo( long no ); //일단 이름 지정
주문수량이 n이상인것의 개수
=> value에 들어갈것을 알아야 진행가능하다
repository / OrderRepository.java
@Query(value = "{ cnt : { $gte : ?0 } }", count = true)
long getCountCntGreater( long cnt );
주문수량이 n이상인것 목록(프로젝션)
repository / OrderRepository.java
@Query(value = "{ cnt : { $gte : ?0 } }", fields = "{ no : 1, cnt : 1, memberid : 1 }" )
List<Order> getCountCntGreaterProject( long cnt );
주문수량이 n이상이고 물품번호 m이상인것(AND) 목록
repository / OrderRepository.java
@Query( value= "{ $and : [{ cnt : { $gte : ?0 } },{ itemno : { $gte : ?1 }] }}" )
List<Order> getCountAndItemno( long cnt, long itemno );
주문수량이 n미만이거나 물품번호가 m미만인것(OR)
repository / OrderRepository.java
@Query( value= "{ $or : [{ cnt : { $lt : ?0 } },{ itemno : { $lt : ?1 }] }}" )
List<Order> getCountOrItemno( long cnt, long itemno );
주문수량이 입력과 일치하는것 삭제
repository / OrderRepository.java
@Query( value = "{ cnt : { $lt : ?0 }}", delete = true)
Long deleteByCnt(long cnt);
=> 주문수량이 n이상이고 물품번호 m이상 인것(AND) 목록
repository / OrderRepository.java
@Query( value= "{ $and : [{ cnt : { $gte : ?0 } },{ itemno : { $gte : ?1 }] }}" )
List<Order> getCountAndItemno( long cnt, long itemno );
Table 15. Supported keywords for query methods => query 메소드 사용방법
// 수량이 n보다 큰것 조회 => findBy변수명GreaterThan
List<Order> findByAgeGreaterThan(long cnt);
서비스에서 호출하여 사용