Facts
✅ 메모장 사이트 CRUD 기능 구현
Findings
✏️ @Transactional
스프링에서 트랜잭션 처리를 하려면,
트랜잭션이 필요한 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주면 된다.
@Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다.
클래스, 메서드 모두에 @Transactional 어노테이션을 붙이면 메서드 레벨의 @Transactional 선언이 우선 적용된다.
// update
@Transactional
public Til updateTil(Long id, TilRequestDto tilRequestDto) {
Til til = tilRepository.findById(id).orElseThrow(
()->new NullPointerException("해당 아이디가 존재하지 않습니다.")
);
til.updateMyTil(tilRequestDto);
return til;
}
✏️ @RequestBody, @RequestParam, @Pathvariable
<스프링 Controller에서 Client로 부터 파라미터를 받는 방법>은 다양히 있다.
@RequestBody, @RequestParam, @PathVariable이 있다.
- RequestBody
- 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body 내용을 Java Object로 변환시켜주는 역할을 한다.
- 바인딩이 아닌 변환을 시키므로 RequstBody를 사용할 객체는 setter 메서드가 필요없다.
👉🏻 ex) TilRequestDto 객체를 자동으로 생성해준다.
URI 변경없이 데이터 받음 (JSON 형식의 데이터를 자바 객체로 변환해서 받기 위해서 HTTP Body 통해 데이터 받음)
function create_til() {
let info = {
tilTitle : $('#title').val(),
til_content : $('#content').val(),
til_view : true,
til_like : 0,
tags: $("#tags").val()
}
$.ajax({
type: "POST",
url: "/til",
contentType: "application/json",
data: JSON.stringify(info),
success: function (response) { // 성공하면
alert("작성 완료!")
window.location.href = "/til_board.html"
}
});
}
@PostMapping("/til")
public Til createTil(@RequestBody TilRequestDto tilRequestDto) {
Til til = tilService.createTil(tilRequestDto);
return til;
}
- RequestParam
- 1개 이상의 HTTP 요청 파라미터를 받기 위해서 사용한다.
- @RequestParam은 필수 여부가 true이기 때문에 기본적으로 반드시 해당 파라미터가 전송되어야 한다.
- 해당 파라미터가 전송되지 않으면 400 Error를 유발하게 된다. 그렇기 때문에 반드시 필요한 변수가 아니라면 required의 값을 false로 설정이 필요하다.
URI통해, 데이터 받음
이 때, URI는 http://127.0.0.1?index=1&page=2 경우로 파라미터의 값과 이름을 함께 전달하는 방식이다.
보통, 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용한다.
$.ajax({
type: "GET",
url: "/til/search?page=${page}&keyword=${keyword}&setting=${setting}",
data: {},
success: function (response) {
console.log(response);
}
});
// read search
@GetMapping("/til/search")
public List<Til> SearchTil(@RequestParam int page, @RequestParam String keyword, @RequestParam String setting){
return tilService.SearchTil(keyword, setting);
}
URI : http://localhost:8080/reservation/api/reservations?reservationEmail=test@naver.com
- Pathvariable
URI통해, 데이터 받음
이 때, URI는 http://127.0.0.1?index/1 경우다.
Rest API에서 값을 호출할 때 주로 많이 사용한다.
@GetMapping("/til_board/{id}")
public Til getTil(@PathVariable Long id){
return tilService.getTil(id);
}
URI : http://localhost:8080/memo/1
✏️ Lambda
What
람다는 함수의 이름을 따로 정의하지 않아도 곧바로 함수처럼 사용할 수 있는 것이다.
람다식이 코드를 보다 간결하게 만들어주는 역할을 하지만 그렇다고 무조건 좋다고만 이야기 할 수가 없다.
Why? 람다를 사용하여서 만든 익명 함수는 재사용이 불가능하기 때문이다.
→ 람다만을 사용할 경우 비슷한 메소드를 중복되게 생성할 가능성이 있으므로 지저분해진다.
형식
[기존의 메소드 형식]
반환타입 메소드이름(매개변수 선언) {
수행 코드 블록
}
[람다식의 형식]
(매개변수 선언) -> {
수행 코드 블록
}
public class Main {
public static void main(String[] args) {
ArrayList<String> strList = new ArrayList<>(Arrays.asList("korea", "japan", "china"));
Stream<String> stream = strList.stream();
stream.map(str -> str.toUpperCase()).forEach(System.out::println);
}
}
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
✏️ Stream
What
스트림은 람다를 활용할 수 있는 기술 중 하나다.
컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자다.
스트림을 활용해서 필터링,데이터 변경, 다른 타입이나 자료구조로 변환 등을 할 수 있다.
특징
- 스트림은 데이터 소스를 변경하지 않는다.
- 스트림은 작업을 내부적으로 반복 처리한다.
- 스트림은 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용이 불가능하다. → 필요할 경우 재생성을 해야한다.
구조
1. 스트림 생성
- 스트림을 이용하기 위해 먼저 스트림을 생성해야 한다.
- Stream<T> Collection.stream() 을 이용하여 해당하는 컬렉션을 기반으로하는 스트림을 생성할 수있다.
2. 중간 연산
- 중간 단계로써 데이터의 형변환 혹은 필터링, 정렬 등 스트림에 대한 가공을 해준다.
- map(변환) / sorted(정렬) / skip(스트림 자르기) / limit(스트림 자르기) 등이 있다.
3. 최종 연산
- 스트림의 요소를 소모해서 결과를 반환하는 단계다. 최종 연산 이후에는 스트림이 닫히게 되고 더 이상 사용할 수 없다.
- collect()를 이용해서 다른 콜렉션으로 바꾸는 것, reduce를 이용해서 incremental calculation하는 것도 가장 많이 쓰이는 패턴이다.
return loadMovies().stream()
.filter(it -> it.getDirector().toLowerCase().contains(directedBy.toLowerCase()))
📝 출처
'Project > TIL, WIL' 카테고리의 다른 글
TIL(42) 11/22 - 11/27 : TDP 사이트 Flask 👉🏻 Spring (0) | 2021.12.22 |
---|---|
TIL(41) 21-11-20 : 조회수, comment 기능 구현 (Flask) (0) | 2021.11.20 |
TIL(39) 21-11-15 : 도커를 사용해서 컨테이너를 구성해보기 (0) | 2021.11.15 |
TIL(38) 21-11-10 : Spring Security + OAuth2 (0) | 2021.11.10 |
TIL(37) 21-11-09 : Object Oriented Programming (0) | 2021.11.09 |