감사쟁이야
감사쟁이의 성장기록
감사쟁이야
  • 분류 전체보기 (130)
    • Java-Spring (0)
    • ComputerScience (0)
    • Project (64)
      • TIL, WIL (57)
      • Project Retrospect (7)
    • Problem Solving (63)
    • Book Review (1)
    • Culture & Discovery (0)
    • Daily Log (2)

블로그 메뉴

  • 홈
  • 깃허브
  • 방명록
hELLO · Designed By 정상우.
감사쟁이야

감사쟁이의 성장기록

TIL(40) 21-11-17 : @Transactional / 스프링 Controller가 Client로 부터 파라미터를 받는 방법 / Lambda와 Stream
Project/TIL, WIL

TIL(40) 21-11-17 : @Transactional / 스프링 Controller가 Client로 부터 파라미터를 받는 방법 / Lambda와 Stream

2021. 11. 17. 23:50

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()))

 

📝   출처

 

Transactional 어노테이션

@Transactional…

tecoble.techcourse.co.kr

 

[Spring] @RequestBody, @ModelAttribute, @RequestParam의 차이

이번에는 Spring에서 Client로 받은 요청을 객체로 바인딩하기 위해 사용하는 방법들에 대해서 알아보도록 하겠습니다. 1. RequestBody, ModelAttribute, RequestParam이란? [ @RequestParam ] @RequestParam은..

mangkyu.tistory.com

'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
    'Project/TIL, WIL' 카테고리의 다른 글
    • TIL(42) 11/22 - 11/27 : TDP 사이트 Flask 👉🏻 Spring
    • TIL(41) 21-11-20 : 조회수, comment 기능 구현 (Flask)
    • TIL(39) 21-11-15 : 도커를 사용해서 컨테이너를 구성해보기
    • TIL(38) 21-11-10 : Spring Security + OAuth2
    감사쟁이야
    감사쟁이야
    sunzero0116@gmail.com

    티스토리툴바