Kim VamPa

[Spring][쇼핑몰 프로젝트][27] 업로드 이미지 정보 등록 - 4 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][27] 업로드 이미지 정보 등록 - 4

Kim VamPa 2021. 6. 14. 10:00
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

목표

업로드 이미지 정보 DB 등록

 AdminServiceImpl.class 에서 코드를 추가하여 상품 등록 및 이미지 등록 처리 기능을 완성하는 것을 목표로 합니다.

 

 

순서

1. AdminServiceImpl.java

2. Junit 테스트

3. 실행 테스트

 

 

1. AdminServiceImpl.java

 현재 AdminServiceImpl.java에 bookEnroll() 메서드는 상품 등록 쿼리문을 처리하는 Mapper 단계의 bookEnroll() 메서드만 호출을 하고 있습니다. 상품 등록 쿼리문뿐만 아니라 상품 이미지 등록 쿼리 또한 실행을 하도록 저번 포스팅에서 작성한 imageEnroll() 메서드를 호출하도록 작업을 할 것입니다.

 

bookEnroll() (Service 단계) :
상품 등록(bookEnroll() (Mapper 단계)) => 이미지 등록 (imageEnroll() (Mapper 단계))

 

 imageEnroll() 메서드(Mapper 단계)는 하나의 이미지 관련 데이터 (AttachImageVO)를 전달받아서 처리하도록 작성되어 있습니다. 문제는 bookVO 클래스에는 여러 개 이미지 관련 데이터(AttachImageVO 클래스)를 처리할 수 있도록 List 타입으로 참조 변수(imageList)가 선언되어져 있다는 점입니다. 그렇기 때문에 imageEnroll()이 데이터를 처리 할 수 있도록 imageList를 통째로 넘겨주어선 안되고, imageList 각 요소 하나씩 넘겨주어야만 합니다. 따라서 imageList의 요소의 크기만큼 반복하여 imageEnroll() 메서드를 호출할 수 있도록 for문을 사용할 것입니다.

 

 for문은 일반적인 for문, 향상된 for문, 람다식을 활용한 for문 중 원하는 방식을 사용하시면 됩니다. AdminServiceImpl.java의 bookEnroll() 메서드 구현부에 Mapper 단계의 bookEnroll() 메서드를 호출한 바로 다음 공간에 아래의 for문중 하나를 선택하여 bookVO클래스의 imageList 변수(이미지 관련 데이터)를 처리하도록 코드를 추가해줍니다.(전 람다식 활용한 for문을 사용하였습니다.)

 

	// 일반적 for문
        for(int i = 0; i < book.getImageList().size(); i++) {
			
		}
		
        // 향상된 for문
		for(AttachImageVO attach : book.getImageList()) {
			
		}
		
        //람다식 활용한 for문
		book.getImageList().forEach(attach ->{
			
		});

 

그림 1-1

 

 현재의 imageList의 각 요소는 bookId 변수의 값이 null입니다. BookVO클래스의  bookId는 Mapper단계의 bookEnroll() 메서드 실행으로 인해서 값이 반환받아져 있는 상태입니다(저번 포스팅에서 mybaits의 selectkey를 통해서). BookVO의 bookId값을 BookVO의 imageList 요소에 있는 AttachImageVO의 bookId에 값을 대입 해줄 것입니다. for문 구현부에 아래와 같은 코드를 추가해줍니다.

 

		book.getImageList().forEach(attach ->{
			
			attach.setBookId(book.getBookId());
			
		});

 

 이미지 등록에 필요로 한 bookId 값을 세팅 해주었기 때문의, Mapper단계의 imageEnroll() 메서드를 호출하고 매개변수로 BookVO의 imageList 요소를 매개변수로 부여해줍니다. 이로써 for문으로 인해 imageList의 요소수만큼 각각 bookId값을 세팅해주고 imageEnroll() 메서드를 호출하게 됩니다.

 

		book.getImageList().forEach(attach ->{
			
			attach.setBookId(book.getBookId());
			adminMapper.imageEnroll(attach);
			
		});

 

그림 1-2

 


 필수는 아니지만 보완적인 코드를 하나 더 추가하겠습니다. 지금 추가하고자 하는 코드의 목적은 사용자가 상품 등록을 할 때 상품 이미지는 첨부하지 않은 경우, 서버에서는 굳이 위에서 작성한 for문을 실행시킬 필요가 없기 때문에 이미지의 존재 여부를 체크하여 Service 단계의 bookEnroll() 메서드가 조기 종료될 수 있도록 하는 것이 목표입니다. 

 

 아래의 그림에 표시한 공간에 코드를 추가해줄 것입니다.

 

그림 1-3

 

 이미지의 존재 여부를 확인하는 방법은 BookVO의 객체에 imageList 참조 변수의 값을 확인하는 것입니다. imageList가 null 이거나 혹은 imageList 변수가 참조하는 객체가 생성되었더라도 요소의 개수가 0이라면 이미지 파일이 없는 것입니다. 

 

imageList == null 또는 imageList.size() <= 0 

=>

첨부 이미지 없음


 따라서 앞서 말한 요인들을 체크하는 if문을 작성을 하고 true(이미지가 없는 경우) Service 단계의 bookEnroll() 메서드가 실행이 종료되도록 구현부에는 return을 작성합니다.

 

		if(book.getImageList() == null || book.getImageList().size() <= 0) {
			return;
		}

 

그림 1-4

 

 

 

2. Junit 테스트

 서버를 직접 구동시켜서 테스트해보기 앞서서 수정한 Service 메서드가 정상적으로 동작을 하는지 Junit 테스트를 해보겠습니다.

 

 src/tests/java 경로의 com.vam.service(없을 경우 추가) 패키지에 AdminServiceTests.java 클래스를 새로 생성합니다.

 

그림 2-1

 

 Junit 테스트를 위한 기본적인 세팅으로 class 선언부에 아래의 어노테이션을 추가해줍니다.

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

 

그림 2-2

 

  AdminService의 메서드를 테스트하는 것이기 때문에 AdminService 클래스를 @Autowired 어노테이션을 활용하여 의존성 주입해주었습니다.

 

	@Autowired
	private AdminService service;

 

그림 2-3

 

 테스트를 위한 메서드를 작성합니다.

 

	/* 상품 등록 & 상품 이미지 등록 테스트 */
	@Test
	public void bookEnrollTEsts() {
		
	}

 

그림 2-4

 

 BookVO 클래스의 객체를 생성하여 각 변수들에 값을 부여(상품 정보, 상품 이미지 정보) 부여해주어서 bookEnroll() 메서드를 호출하도록 코드를 작성합니다.

 

	/* 상품 등록 & 상품 이미지 등록 테스트 */
	@Test
	public void bookEnrollTEsts() {

		BookVO book = new BookVO();
		// 상품 정보
		book.setBookName("service 테스트");
		book.setAuthorId(27);
		book.setPubleYear("2021-03-18");
		book.setPublisher("출판사");
		book.setCateCode("202001");
		book.setBookPrice(20000);
		book.setBookStock(300);
		book.setBookDiscount(0.23);
		book.setBookIntro("책 소개 ");
		book.setBookContents("책 목차 ");

		// 이미지 정보
		List<AttachImageVO> imageList = new ArrayList<AttachImageVO>(); 
		
		AttachImageVO image1 = new AttachImageVO();
		AttachImageVO image2 = new AttachImageVO();
		
		image1.setFileName("test Image 1");
		image1.setUploadPath("test image 1");
		image1.setUuid("test1111");
		
		image2.setFileName("test Image 2");
		image2.setUploadPath("test image 2");
		image2.setUuid("test2222");
		
		imageList.add(image1);
		imageList.add(image2);
		
		book.setImageList(imageList);        
		
		// bookEnroll() 메서드 호출
		service.bookEnroll(book);
		
		System.out.println("등록된 VO : " + book);
		
		
	}

 

그림 2-5

 

 Junit 테스트를 진행합니다.

 

그림 2-6

 console창에 등록된 bookId가 무엇인지 볼 수 있도록 코드를 추가했는데  아래 그림을 보시다시피 3124가 찍혀있습니다.

 

그림 2-7

 

DB에 vam_book과 vam_image 테이블에 해당 bookId행이 정상적으로 추가되었는지 확인합니다.

 

그림 2-8

 

그림 2-9

 

 

3. 실행 테스트

 Junit 테스트를 통해서 Service 메서드가 정상적으로 동작하는 것을 확인하였습니다. 이번엔 서버를 구동시켜서 등록 테스트를 합니다.

 

그림 3-1

 

그림 3-2

 

그림 3-3

 

그림 3-4

 

 

REFERENCE

  • 코드로배우는 스프링 웹 프로젝트(남가람북스)
  •  

 

 

 

DATE

  • 2020.06.14

 

728x90
반응형
Comments