본문 바로가기
728x90
728x90

Study/Spring15

@Transactional(readOnly = true) 이거 왜함..? 그냥 안쓰면 되는거 아님? @Transactional 다른 크루들은 이미 많이 사용해본 듯 하지만, 나는 이번 미션(지하철)을 하면서 처음으로 @Transactional 어노테이션을 사용해봤다. @Transactional 주석을 통해 트랜잭션의 범위를 지정하는 사용한다. 트랜잭션 데이터 베이스의 상태를 변환 시키는 프로그램의 단위작업. 무슨 말이냐 하면, @Transactional 어노테이션을 사용하면, Spring은 해당 메서드에 대한 트랜잭션 관리를 자동으로 처리한다. 메서드가 호출 될 때 트랜잭션이 시작되고, 메서드가 정상적으로 완료되면 트랜잭션이 커밋되며, 예외가 발생하는 트랜잭션은 롤백된다. 만약, @Transactional 어노테이션을 클래스레벨에서 사용한다면, 해당 클래스의 모든 메서드에 대해 트랜잭션 관리를 하게된다.. 2023. 5. 22.
JSON 필드 하나면 왜 Jackson 파업함? 이번 장바구니 미션 2단계 를 진행하면서, 도저히 이해할 수 없는 에러가 하나 생겼었는데 왜 이러한 에러가 생겼고, 어떻게 해결 했는지 기록을 남겨보려 한다. 예외 발생 user 별로 장바구니를 추가하는 기능을 만들다 발생한 에러였다. 다음은 CartController의 일부이다. @PostMapping public ResponseEntity addProductToCart( @AuthenticationPrincipal User user, @RequestBody CartCreateRequest cartCreateRequest ) { final Long cartId = cartService.addProduct(user, cartCreateRequest.getProductId()); return Respons.. 2023. 5. 9.
[Spring] 200 vs 204 vs 404 자동차 미션 2단계를 진행하면서, 전체 저장내용을 불러오는 기능을 구현해야 했다. 그런데, 만약 저장된 게임이 없다면 응답을 어떻게 줘야할까? NoContent vs Empty List status code 204(no content)의 존재를 어디선가 주어 들어서 알고는 있었다. 말그대로 응답할 콘텐트가 없다는 뜻이니, 이걸 사용하면 좋겠다란 생각이 들어서 해당 status코드를 이용하여 응답을 주었다. @GetMapping("/plays") public ResponseEntity getResults() { List allResults = gameService.getAllResults(); if (allResults.isEmpty()) { return ResponseEntity.noContent().b.. 2023. 4. 24.
[Spring] @Repository vs @Component 삽질로그 결론부터 얘기하자면 @Repository 와 @Component는 bender 마다 다른 DB관련 예외를 @Repository어노테이션을 사용하면, DataAccessException으로 전환해준다고 한다. 이하의 글은 @Repository의 예외전환을 직접 확인해보고픈 욕심을 가진 의심병말기환자의 삽질 글임. 오늘 Spring Core 강의 에서 Dao에 @Repository 를 사용하냐 @Component 를 사용하냐 얘기를 나누던 도중 어떤 크루가 Dao 에 붙어있던 @Repository를 @Component로 바꿨더니, 잘 되던게 안된다고 했다. 나도 궁금해져서 해보니까 난 잘되더라. 근데 얘네 무슨 차이가 있는 걸까. 공식문서 확인 가장 신뢰도 높은 확인방법이라 생각하고 공식문서를 확인해봤다. .. 2023. 4. 23.
[Spring] @ResponseBody 무쓸모 아님?(HttpMessageConverter, ResponseEntity) 이번에 웹 자동차경주 미션 1단계를 진행 하면서 프론트에서 보낸 요청에 대해 응답을 주기 위해, @ResponseBody 어노테이션을 method에 붙여주었다. @PostMapping("/plays") @ResponseBody public ResultDto play(@RequestBody GameInfoDto gameInfoDto) { ... } 그런데 페어인 이리내가 @ResponseBody 어노테이션을 제거하면 어떻게 되냐고 물어보길래, "글쎄... 해보쉴?" 하고 어노테이션을 제거하고 실행해봤다. 그런데 예상과 달리 어노테이션의 유무와 상관없이 똑같이 동작하더라. @ResponseBody는 사실 간지용이 아닐까..? @ResponseBody 간지용인지 아닌지 확인하기 위해 뭐하는 놈인지 확인을 해봤.. 2023. 4. 14.
[Spring] 자동 의존관계 주입 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 싱글톤 컨테이너 와 이어지는 포스팅입니다. 전체 소스코드 보기 다양한 의존관계 주입방법 의존 관계 주입의 방법은 크게 4가지가 있다. 생성자 주입 수정자 주입(setter) 필드 주입 일반 메서드 주입 생성자 주입 말그대로 생성자를 통해서 의존관계를 주입하는 방법이다. 이전의 포스팅에서 사용한 방법이 전부 생성자 주입이다. 특징으로는 생성자 호출 시점에 딱 한번만 호출되는것이 보장되고, 불변적이고 필수적인 의존관계에서 사용 된다는 점이다. 예제로 이전에 작성했던 OrderServiceImpl을 확인해보자. @Component public class OrderServiceImpl implements OrderService{ .. 2023. 2. 2.
[Spring] 컴포넌트 스캔 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 싱글톤 컨테이너 와 이어지는 포스팅입니다. 전체 소스코드 보기 컴포넌트 스캔과 의존관계 자동 주입 이전 포스팅까지 스프링 빈을 등록할 때는 AppConfig 파일에 @Bean을 통해서 설정정보에 직접 등록할 스프링 빈을 작성했다. 근데 이거 귀찮다. 매우. 지금은 아주 간단한 예제코드를 작성하는 거기 때문에 별거 없네 라고 생각할 수 있지만, 실무에서는 수십, 수백개의 스프링빈을 등록해야 될거다. 근데 이렇게 된다면 당연하게도 누락되는 일도 생길거고, 설정정보도 지나치게 방대해지고, 가장 중요한건 귀찮다.. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이란 기능을 제공한다. 또한, 의존 관.. 2023. 2. 1.
[Spring] 싱글톤 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 스프링 컨테이너와 이어지는 포스팅입니다. 전체 소스코드 보기 웹애플리케이션과 싱글톤 웹 애플리케이션은 보통 여러고객이 동시에 요청을 한다. 만약 3명의 고객이 회원가입을 한다면, 각각의 요청마다 새로운 memberService 가 생겨날 것이다. 테스트 코드를 통해 확인해보자. public class SingletonTest { @Test @DisplayName("여러개의 멤버 서비스 생성 확인") void memberServiceTest() { AppConfig appConfig = new AppConfig(); MemberService memberService1 = appConfig.memberService(); Mem.. 2023. 1. 31.
[Spring] 스프링 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] DI와 IoC 그리고 컨테이너와 이어지는 포스팅입니다. Spring 컨테이너로 변경 이전 포스팅에서 순수 Java로 DI 컨테이너를 Spring 컨테이너로 변경하는 작업을 해볼거다. 그리고 스프링컨테이너에 등록된 객체들을 조회하는 방법도 알아보려 한다. 전체코드는 깃헙에 올라가있음 AppConfig 우선 AppConfig 를 수정해보자. @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberReposi.. 2023. 1. 19.
[Spring] DI와 IoC 그리고 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. DI DI는 의존성 주입(Dependency Injection)이란 뜻으로, 의존 관계를 외부에서 결정 하여 주입한다는 의미 이다. 의존관계란? A클래스와 B클래스가 있을 때, B클래스의 변경이 A클래스에 영향을 미칠 때 A는 B와 의존 관계라고 한다. DI를 통해 모듈간의 결합도가 낮아지고 유연성이 높아진다. IoC IoC는 제어의 역전(Inversion of Control) 이라는 의미이다. 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. 대부분의 프레임워크에서 사용하는 방식이다. 덕분에 개발자는 프레임워크에 필요한 부품을 개발하고, 조립하는 방식의 개발을 하게 된다. 이렇게 조립된 코드의.. 2023. 1. 16.
[Spring] 스프링의 역사 EJB의 몰락 옛날 옛적에는(2000년 초반) EJB라는 기술이 있었고, 이게 Java 진영의 표준이었다. 당연하게도 금융권을 포함한 모든 곳에서 널리 사용 되었고, EJB이외의 오픈 소스들은 사파로 취급당했다. 그런데 EJB는 이론적으로는 굉장히 뛰어난 기술이었지만, 실제 사용하는 개발자들에게는 한숨메이커 였다고 한다. 일단 비쌌고, EJB에 굉장히 종속적으로 프로그래밍 할 수밖에 없어 객체지향적인 설계가 불가능했고, 테스트를 하기에도 힘들거나 아예 불가능 했다고 한다. 게다가 느리기까지. 총체적 난국이었다. 이외에도 여러 단점들이 있었다고 하는데, 그래도 어쩌나 이거 안쓰면 사파 취급당하니.. 눈물을 머금고 어거지로 썼다고 한다. 그러다가 참다 참다 폭발한 두명의 개발자가 판을 흔들기 시작한다. Hi.. 2023. 1. 11.
[Spring] mySql + JPA CRUD 인텔리J 유료버전 기준으로 작성된 글 입니다 Java Version 11 [Spring] 스프링 부트 시작하기. Hello, World! [Spring] form 태그와 JSON 형식을 이용한 요청 [Spring] Spring mySql 연결 + JPA 과 이어지는 내용입니다. 설정 저번 포스팅에서 DB와 연결만 해놓고 서비스 로직을 작성할 어떠한 설정도 하지 않았다. 이제 해야됨. Repository repository 부터 생성을 해보자. package com.example.helloworld.repository; import java.util.List; import com.example.helloworld.domain.User; public interface UserRepository { User .. 2023. 1. 4.
[Spring] Spring mySql 연결 + JPA 인텔리J 유료버전 기준으로 작성된 글 입니다 Java Version 11 [Spring] 스프링 부트 시작하기. Hello, World! [Spring] form 태그와 JSON 형식을 이용한 요청 과 이어지는 내용입니다. 라이브러리 의존성 추가 우선 build.gradle을 열어서 dependencies에다가 mySql과 JPA라이브러리 의존성을 추가해주자. implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'mysql:mysql-connector-java' 이 위에 두개를 붙여 넣으면 된다. runtimeOnly는 컴파일 시점에는 필요없지만 실행 시점에는 꼭 필요한 라이브러리의 의존성을 추가할 때 사용한.. 2023. 1. 4.
[Spring] form 태그와 JSON 형식을 이용한 요청 인텔리J 유료버전 기준으로 작성된 글 입니다 Java Version 11 [Spring] 스프링 부트 시작하기. Hello, World!와 이어지는 글입니다. @RequestParam 회원 가입을 할 수 있는 간단한 form을 만들고, 제출 그리고 이 form.html을 /form 이라는 url에 get요청이 들어올 때 보여주자. public class HelloController { @GetMapping("/") public String hello() { return "hello"; } @GetMapping("/form") public String form() { return "form"; } } 이렇게 작성 해준 뒤, 서버를 한번 껐다 켜준 뒤에 localhost:8080/form 접속 해보면, 위와.. 2023. 1. 4.
[Spring] 스프링 부트 시작하기. Hello, World! 인텔리J 유료버전 기준으로 작성된 글 입니다 Java Version 11 프로젝트 생성 인텔리J를 실행 시키고 New Project를 통해 프로젝트를 생성한다. 프로젝트 이름은 HelloWorld 이다. 왼쪽에 수많은 아이콘들이 있는데, 그중 Spring Initializr를 클릭하고 오른쪽과 같이 설정한다. 현재 사용하는 Java version은 11이다. 인텔리J 무료버전은 Spring Initializr가 지원하지 않는다. Spring Initializr를 통해 손쉽게 시작할 수 있다. Next를 누르면 최상단에 Spring boot version을 선택할 수 있는데, 3.0.0 버전 이상은 Java17 을 필요로 한다. 사용하는 Java version에 맞게 설정한다. 왼쪽에 여러 라이브러리들이 .. 2023. 1. 3.
728x90
728x90