20220826 [Spring Boot]

Yeoonnii·2022년 8월 29일
0

TIL

목록 보기
14/52
post-thumbnail

주문하기

entity / Order.java 생성

@Document(collection = "boot_order")
mongodb컬렉션 사용시 @Document 꼭 사용 하기!

OrderController.java 생성

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보다 자세한 정보를 알 수 있고 보기 쉽다.

=> 자바 클래스 시작은 대문자로! 변수 시작은 소문자로 사용한다.



OrderService.java

  • 서비스 파일 생성 => 오버라이드 생성되면 이미 정의되었다는것!
    서비스에서 MongoTemplate 안쓰고 따로 저장소 따로 분류 하여 생성 => OrderRepository.java 생성

insertOrder 주문하기

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;
        }
    }

deleteOrder 삭제하기

oRepository.delete(order); 반환값이 void이기 떄문에 바로 예외처리를 해주어야한다

    public int deleteOrder(Order order) {
        try {
            oRepository.delete(order);
            return 1;
            
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

updateOrder 수정하기

변경하고자 하는 기본키 정보를 추가하여 저장한다 (마치 덮어쓰기 같이)

  • 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)의 위치를 지정해준다.

Application.java

// 컨트롤러, 서비스의 위치
@ComponentScan(basePackages = {"com.example.controller", "com.example.service"} )

// 엔티티의 위치
@EntityScan(basePackages = {"com.example.entity"}  )

// 저장소(JAP, hibernate)의 위치
@EnableMongoRepositories(basePackages = {"com.example.repository"})

OrderRepository.java 생성

  • OrderRepository.java 생성 후 MongoRepository를 extends(상속)해준다
    => MongoRepository 를 상속함으로 MongoRepository의 속성을 사용할 수 있다
  • MongoRepositoryctrl + 클릭해보면 기본 crud가 작성되어 있는것을 확인 할 수 있으며
    아래와 같은 사용 형태 또한 알 수 있다
    => MongoRepository<T,ID> = MongoRepository <엔티티 타입, 엔티티 기본타입> 으로 와야한다
  • 변수 생성시 findBy변수명GreaterThan 으로 사용하고 변수명은 반드시 대문자를 사용해야한다.
  • 아래의 findByNoIn 처럼 repository 내의 변수명은 같아도 된다!
    => 왜냐하면 사용시 변수마다 파라미터는 다르기 때문에 변수명 같이 쓸수 있다
    변수 사용시 사용하고자 하는 알맞은 파라미터의 변수를 사용한다.

selectCntGreaterThan 수량이 n보다 큰것 조회

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);
    }

findByNoIn 주문번호가 해당하는 항목만 조회

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);
    }

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);
    }

전체 주문 조회(interface entity 생성)

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(native query) 사용하여 조건 생성

  • query문 사용하면 메소드명은 중요하지 않다. query 작성문이 더욱 중요함!
    => gte는 이상 gt는 초과 lt 미만 lte 이하
  • 추가적인 문법은 mongodb 메뉴얼 확인하기
  • ?0 실제로 넘어오는 데이터를 넣어주는 위치

getCntGrater

수량이 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);
    }

getFindNo

=> 주문번호가 일치하는 것 조회(하나밖에 없을것)
repository / OrderRepository.java

    @Query(value = "{ no : 0? }")//native로 바꿈
    Order getFindNo( long no ); //일단 이름 지정

getCountCntGreater

주문수량이 n이상인것의 개수
=> value에 들어갈것을 알아야 진행가능하다
repository / OrderRepository.java

    @Query(value = "{ cnt : { $gte : ?0 } }", count = true)
    long getCountCntGreater( long cnt );

getCountCntGreaterProject

주문수량이 n이상인것 목록(프로젝션)

repository / OrderRepository.java

    @Query(value = "{ cnt : { $gte : ?0 } }", fields = "{ no : 1, cnt : 1, memberid : 1 }" )
    List<Order> getCountCntGreaterProject( long cnt );

getCountAndItemno

주문수량이 n이상이고 물품번호 m이상인것(AND) 목록
repository / OrderRepository.java

    @Query( value= "{ $and :  [{ cnt : { $gte : ?0 } },{ itemno : { $gte : ?1 }] }}" )
    List<Order> getCountAndItemno( long cnt, long itemno );

getCountOrItemno

주문수량이 n미만이거나 물품번호가 m미만인것(OR)
repository / OrderRepository.java

    @Query( value= "{ $or :  [{ cnt : { $lt : ?0 } },{ itemno : { $lt : ?1 }] }}" )
    List<Order> getCountOrItemno( long cnt, long itemno );

deleteByCnt

주문수량이 입력과 일치하는것 삭제
repository / OrderRepository.java

    @Query( value = "{ cnt : { $lt : ?0 }}", delete = true)
    Long deleteByCnt(long cnt);

getCountAndItemno

=> 주문수량이 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);

서비스에서 호출하여 사용

0개의 댓글