일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 클린코드
- 우레탄지퍼
- 지연환가료
- 요척합의
- 미국영어연음
- 비리짐
- Armhole Drop
- 헤이큐
- 슈퍼코딩
- 40HQ컨테이너40GP컨테이너차이
- AATCC
- TACKING
- 영어시간읽기
- 엑셀드래그단축키
- 봉제용어
- WHATTIMEOFTHEDAY
- 엑셀필터복사붙여넣기
- 40HQ컨테이너
- 고급영어단어
- MERN스택
- 필터링후복사붙여넣기
- 와끼
- 나일론지퍼
- 비슬론지퍼
- 자켓실측
- 웹API
- 암홀트롭
- 엑셀자동서식
- 미니마카
- 핸드캐리쿠리어차이점
- Today
- Total
CASSIE'S BLOG
99-1강 스프링 부트 롬복과 MapStruct 사용하기 본문
빈주입에는 생성자주입이 있는데 필드주입, 세터주입이 있고 생성자주입이 제일 많이 쓰인다.
지금 생성자 주입하고 있는데 새로운 빈이 의존성 주입이 "추가" 될 때마다 constructor를 고쳐줘야했었다.
dao layer에서 실제 data랑 매핑되는 entity도 equals, setter 이 반복되는 코드를 lombok를 통해서 개선할 예정이다.
lombok은 라이브러리 외에도 플러그인을 설치를 해야지 실제로 사용가능
dependencies에도 2개 파란색 표시된거를 적어줘야한다.
settings>plugin>체크이미 되어있는거 보니 나는 이미 설치 되어있음
build.gradle에 들어가서
before
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'
}
이거 그냥 복붙해서 넣어주면 된다.
compileOnly 'org.projectlombok:lombok:'
annotationProcessor 'org.projectlombok:lombok:'
이렇게
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 뜨면 잘 된거임.
이 부분 개선해본다고함.
public String registerItem(@RequestBody ItemBody itemBody){
Integer itemId = electonicStoreItemService.saveItem(itemBody);
return "ID: " + itemId;
}
ItemBody 개선해볼 예정
@NoArgsConstructor
추가하고, getter 지우고, 생성자 지워도 똑같이 잘 실행됨
BuyOrder DTO 도 리팩토링 (getter메소드, 생성자 없애고 어노테이션으로 대체)
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
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 이것만 있으면 밑에 빈 주입 부분 없어도 됨.
this.electonicStoreItemService = electonicStoreItemService;
}
'PROGRAMMING > 슈퍼코딩 강의 정리' 카테고리의 다른 글
100-1강 스프링 부트의 문서화와 로깅 남기기 (0) | 2024.03.06 |
---|---|
99-2강 스프링 부트 롬복과 MapStruct 사용하기 (0) | 2024.03.05 |
98강 Big picture (부제: 스프링 부트 좀 더 사용하기) (0) | 2024.03.04 |
97강 Spring Boot 기본 wrap-up (0) | 2024.03.04 |
96-3강 스프링 부트 실전 적용하기 v1 (CRUD만들기) (0) | 2024.03.02 |