관리 메뉴

CASSIE'S BLOG

99-1강 스프링 부트 롬복과 MapStruct 사용하기 본문

PROGRAMMING/슈퍼코딩 강의 정리

99-1강 스프링 부트 롬복과 MapStruct 사용하기

ITSCASSIE1107 2024. 3. 4. 19:40

 

 

빈주입에는 생성자주입이 있는데  필드주입, 세터주입이 있고 생성자주입이 제일 많이 쓰인다. 

 

지금 생성자 주입하고 있는데 새로운 빈이 의존성 주입이 "추가" 될 때마다 constructor를 고쳐줘야했었다. 

 

dao layer에서 실제 data랑 매핑되는 entity도 equals, setter 이 반복되는 코드를 lombok를 통해서 개선할 예정이다.

 

 

 

lombok은 라이브러리 외에도 플러그인을 설치를 해야지 실제로 사용가능 

dependencies에도 2개 파란색 표시된거를 적어줘야한다.

 

 

 

settings>plugin>체크이미 되어있는거 보니 나는 이미 설치 되어있음

 

build.gradle에 들어가서 

before

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'mysql:mysql-connector-java:8.0.26'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

이거 그냥 복붙해서 넣어주면 된다.

//lombok
compileOnly 'org.projectlombok:lombok:'
annotationProcessor 'org.projectlombok:lombok:'

 

이렇게

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
//lombok
compileOnly 'org.projectlombok:lombok:'
annotationProcessor 'org.projectlombok:lombok:'

runtimeOnly 'mysql:mysql-connector-java:8.0.26'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

위에 코끼리 버튼이 있으면 클릭을 하라는데 

설치됐는지 알아보려면 Item 클래스에가서 이렇게 @Getter 치면 lombok 뜨면 잘 된거임.

 

 

이 부분 개선해본다고함.

 

@PostMapping("/items")
public String registerItem(@RequestBody ItemBody itemBody){
Integer itemId = electonicStoreItemService.saveItem(itemBody);
return "ID: " + itemId;
}

 

ItemBody 개선해볼 예정

 

@Getter
@NoArgsConstructor

 

추가하고, getter 지우고, 생성자 지워도 똑같이 잘 실행됨

 

 

BuyOrder DTO 도 리팩토링 (getter메소드, 생성자 없애고 어노테이션으로 대체) 

 

package com.github.supercoding.web.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@NoArgsConstructor
public class BuyOrder {

private Integer itemId;
private Integer itemNums;


}

 

ItemBody는들어오는 dto고 Item은 나가는 dto

 

Item도 리팩토링 잘 돌아간다. 

 

 

깃허브 커밋 내용 보면 됨. branch 99-1

 

ElectonicStoreController에 빈 주입하는 부분 할 예정 

 

여기서 빈 생성자 private ElectronicStoreItemService electonicStoreItemService; 같은 경우에는 final로 많이 이룬다고함

final 상수로 넣는 것. 변하지 않는 것으로  "final 키워드를 electronicStoreItemService에 넣어준다.

한번 Controller만들어져서 이 Service가 빈으로 들어가게되면은 그 빈이 변경될 이유가 없다. 

 

before

package com.github.supercoding.web.controller;

import com.github.supercoding.service.ElectronicStoreItemService;
import com.github.supercoding.web.dto.BuyOrder;
import com.github.supercoding.web.dto.Item;
import com.github.supercoding.web.dto.ItemBody;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


@RestController
@RequestMapping("/api")
public class ElectronicStoreController {

private ElectronicStoreItemService electonicStoreItemService;

public ElectronicStoreController(ElectronicStoreItemService electonicStoreItemService) {
this.electonicStoreItemService = electonicStoreItemService;
}
ele
private static int serialItemId = 1;
private List<Item> items = new ArrayList<>(Arrays.asList(
new Item (String.valueOf(serialItemId++), "Apple iPhone12", "Smartphone", 1490000, "A14 Bionic", "512GB"),
new Item (String.valueOf(serialItemId++), "Galaxy S12 Ultra", "Smartphone", 1490000, "A14 Bionic", "512GB")
));


@GetMapping("/items")
public List<Item> findAllItem (){

return electonicStoreItemService.findAllItem();
}

@PostMapping("/items")
public String registerItem(@RequestBody ItemBody itemBody){
Integer itemId = electonicStoreItemService.saveItem(itemBody);
return "ID: " + itemId;
}

@GetMapping("/items/{id}")
public Item findItemByPathId(@PathVariable String id ){
return electonicStoreItemService.findItemByPathId(id);
}

@GetMapping("/items-query")
public Item findItemByQueryId(@RequestParam("id") String id ){
return electonicStoreItemService.findItemById(id);
}

@GetMapping("/items-queries")
public List<Item> findItemByQueryId(@RequestParam("id") List<String> ids ){
return electonicStoreItemService.findItemsByIds(ids);
}

@DeleteMapping("/items/{id}")
public String deleteItemByPathId(@PathVariable String id){
electonicStoreItemService.deleteItem(id);
return "Object with id =" + id + "has been deleted";
}

@PutMapping("/items/{id}")
public Item updateItem (@PathVariable String id, @RequestBody ItemBody itemBody) {
return electonicStoreItemService.updateItem(id, itemBody);
};

//NOTE: storeSales 테이블 추가 후 http://localhost:8080/v3/api/items/buy
@PostMapping("/items/buy")
public String buyItem(@RequestBody BuyOrder buyOrder){
Integer orderItemNums = electonicStoreItemService.buyItems(buyOrder);
return "요청하신 Item " + orderItemNums + "개를 구매하였습니다.";
}
}

 

 

이 부분을 아예 지워도 @RequiredArgsConstructor 이것만 있으면 밑에 빈 주입 부분 없어도 됨. 

public ElectronicStoreController(ElectronicStoreItemService electonicStoreItemService) {
this.electonicStoreItemService = electonicStoreItemService;
}

 

반응형