개발자의 오르막

[Spring Boot + JPA ] DomainClassConvert, Pageable 본문

SpringFrameWork/SpringBoot

[Spring Boot + JPA ] DomainClassConvert, Pageable

계단 2019. 10. 8. 18:37

# Store domain

@Getter
@Setter
@Entity
@Table(name = "tb_store")
@EqualsAndHashCode(of="storeNum")
@ToString(exclude="user")
public class Store {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long storeNum;
	
	private String storeName;
	
	private String storePhone;
	
	private String storeAddress1;
	
	private String storeAddress2;
	
	private String businessTime;
	
	private String storeHoliday;
	
	private String sotreIntro;
	
	@JsonIgnore
	@ManyToOne(fetch=FetchType.LAZY)
	private Member user;
}

 

# Repository

public interface MypageCustomCrudRepository extends CrudRepository<Store, Long>, CustomMypage{

}

 

# RestController

@Autowired
	private MypageCustomCrudRepository storeRepository;
	
	@GetMapping("/store/{id}/{storeNum}")
	public String getStores(@PathVariable("id") Long id, @PathVariable("storeNum") Long storeNum){
		Optional<Store> byStoreNum = storeRepository.findById(storeNum);
		Store store = byStoreNum.get();
		return store.getStoreName();
	}

 

# Test

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class RestMypageControllerTests {

	@Autowired
	MockMvc mockMvc;
	
	@Autowired
	MemberRepository memberRepo;
	
	@Autowired
	MypageCustomCrudRepository storeRepo;
	
	@Test
	public void getStore() throws Exception {
		Member member = new Member();
		member.setUemail("kjuiop@naver.com");
		memberRepo.save(member);
		
		Store store = new Store();
		store.setUser(member);
		store.setStoreName("랍스타 맛집");
		store.setStoreAddress1("서울 서초구");
		store.setStoreAddress2("양재 2동");
		
		storeRepo.save(store);
		
		
		mockMvc.perform(get("/mypage/store/" + member.getId() + "/" + store.getStoreNum()))
		.andDo(print())
		.andExpect(status().isOk())
		.andExpect(content().string("랍스타 맛집"));
	}
}

- 테스트 통과

- Converter<S,T> : 하나의 타입을 다른 타입으로 변환하는 인터페이스

  DomainClassConverter 이 Spring에서 공통적으로 지원하는 Converter입니다.

 

@Autowired
	private MypageCustomCrudRepository storeRepository;
	
	@GetMapping("/store/{id}/{storeNum}")
	public String getStores(@PathVariable("id") Long id, @PathVariable("storeNum") Long storeNum){
		Optional<Store> byStoreNum = storeRepository.findById(storeNum);
		Store store = byStoreNum.get();
		return store.getStoreName();
	}
@GetMapping("/store/{id}/{storeNum}")
	public String getStores(@PathVariable("id") Long id, @PathVariable("storeNum") Store store){
		return store.getStoreName();
	}

- 위에서 매개변수를 Long 타입으로 strongNum으로 받았던 것을 Store 객체로 Convert되어 같은 기능이

  수행됨을 알수 있습니다.

  대신 PathVariable("") 을 통해 어떤 파라미터를 어떤 변수로 변환할 것인지를 명시해야 올바르게

  사용 가능합니다.

- 밑의 코드로도 제대로 동작 가능

 


# Pageable

 

- RestController

@GetMapping("/store/{id}")
	public Page<Store> getStores(Pageable pageable){
		return storeRepository.findAll(pageable);
	}

- Test

@Test
	public void getStores() throws Exception {
		Member member = new Member();
		member.setUemail("wcgfsdw@naver.com");
		memberRepo.save(member);
		
		Store store = new Store();
		store.setUser(member);
		store.setStoreName("랍스타 맛집");
		store.setStoreAddress1("서울 서초구");
		store.setStoreAddress2("양재 2동");
		storeRepo.save(store);

		
		mockMvc.perform(get("/mypage/store/" + member.getId())
		.param("page", "0")
		.param("size", "10")
		.param("sort", "storeName"))
		.andDo(print())
		.andExpect(status().isOk());
		
	}

 

- Console 창

 

Comments