반응형

JAVA/JAVA | Spring 학습기록 72

[Spring+React] 스프링과 리액트 연동해보기 (IntelliJ + Spring + Gradle + React)

원래는 BE는 스프링으로, FE는 타임리프로 열심히 프로젝트를 하고 있었다가, 비동기 처리 부분에서 타임리프의 한계를 느껴 java 공부는 잠시 뒤로 하고 리액트를 주구장창 파고 있는 중이다. 자바스크립트가 하다보면 재밌는데, 자바랑 너무 느낌이 다른 언어라 아직은 익숙치 않다... (자바가 꼰대언어라면, 자바스크립트는 미쳐 날뛰는 잼민이같은 느낌이랄까...) 아무튼 그래서 리액트 공부도 하고 있고, 스프링도 다루고 있으니 한번 둘을 연동해보는 환경세팅 포스팅을 작성해보면 좋을 것 같아 포스팅을 작성한다. 요구 선행지식 - 간단한 리액트 / 자바 지식 및 MVC 구조 리액트와 스프링을 연동하는 것이니, 당연히 리액트가 뭔지, 스프링이 뭔지 정도는 알아야 한다. 스프링을 할 줄 아려면 java 프로그래밍 ..

[211004] [일기] 프로젝트를 위한 스프링 검증파트 공부중...

현재 내 프로젝트 이슈의 절반은 에러처리 관련 이슈이다. BE: Spring Boot + JPA FE: Thymeleaf (내가 리액트를 잘 못하니까!) 로 진행하는 프로젝트 깃헙이다. 구글링하면서 이것저것 알아보던중, @Valid, @Validated, BindingResult, 그리고 타임리프의 th:object, th:field 기능으로 에러처리를 처리할 수 있음을 알았는데, 알고보니 이부분이 김영한 스프링 MVC 2편의 검증/에러처리 파트에서 아주 상세히 다룬다고 한다. 이제 이것들만 들으면 저 이슈들을 다 처리할 수 있겠군! 금방이겠네? 언제 다듣지?ㅋㅋㅋ 내 프로젝트는 현재 따로 프론트엔드 프레임워크를 사용하지 않고 Thymeleaf 템플릿엔진으로 프로젝트를 진행하고 있기 때문에 섹션9는 포함..

[TDD] Test 코드에서 Exception을 받고 싶을 때

간혹 테스트코드를 작성할 때, 예외를 띄우는 것을 기대하는 경우가 있을 것이다. 그런 경우는 아래와 같이 작성하면 된다. @Test void notFoundMessageCode(){ Assertions.assertThatThrownBy(()-> messageSource.getMessage("no_code", null, null)) .isInstanceOf(NoSuchMessageException.class); } - assertThatThrownBy : 예외가 throw됐을 경우 그 예외를 catch해주는 기능을 가진다. 위 코드에선, no_code라는 메시지가 저장돼있지 않아 람다식에서 NoSuchMessageException 에러를 throw해주었으며, 따라서 isInstanceOf에서 예상한 에러 ..

[Java] 자바 final의 역할과 싱글톤 패턴

스프링 MVC 2편을 듣던 도중, 싱글톤 패턴 관련 내용이 나와서 오랜만에 싱글톤 패턴 내용을 복습하던 중 final에 대한 궁금증이 생겨서 공부한 내용을 포스팅해보려 한다. (역시 Java 기본기가 중요한듯하다.) 먼저 singleton pattern이 어떤 과정에서 필요하게 됐는지부터 서술하겠다. 싱글톤 패턴이 필요했던 이유 Controller에서 model에 attribute할 때, 똑같은 객체를 여러 메소드에서 attribute해야 하는 경우가 생길 수 있다. 이럴 경우 코드가 중복되며, 코드 길이가 길어지기 때문에 가독성 또한 좋지 않다. List와 같은 컬렉션 객체를 컨트롤러 내의 수많은 메소드에 attribute하기엔 중복되는 코드가 많기 때문에 @ModelAttribute 관련 메소드를 아..

[SQL][TDD] ERROR 1146 (42S02): Table doesn't exist 해결

로그인 구현을 위해 해시함수를 구현하여 encrypt를 해주는 Salt 기능을 만들기 위해 테스트를 하던 중 [SQL] ERROR 1146 (42S02): Table doesn't exist 에러가 발생했다. 그 이유는 아래 Salt Entity가 존재하는데, Salt 테이블이 만들어지지 않기 때문이다. @Entity @Getter @Setter public class Salt { @Id @GeneratedValue private Long id; @NotNull private String salt; public Salt() {} public Salt(String salt) { this.salt = salt; } } 참고로 이 Salt Entity는 Member Entity와 1:1 연관관계 매핑이 돼있는..

[TDD] @Rollback을 쓰면 원래 DB의 데이터도 사라질까?

@Rollback을 쓰기에 겁나는 사람을 위해 포스팅해본다. 테스트 코드를 작성할 때, @Rollback이라는 기능을 쓰면 테스트 코드에서 insert한 데이터들을 다시 rollback 시켜준다는 점은 모두 알고 있을 것이다. 예시로 db가 텅 비어있었는데, test code에서 repository.save(member1); 을 한다고 해도, @Rollback 어노테이션을 붙일 경우 db가 rollback되어 텅 비는 것을 확인할 수 있기 때문이다. 그럼 db가 비어있지 않고 데이터가 이미 있는 경우에선 rollback을 써도 될까? 정답은 YES. @Rollback은 테스트 코드에서 insert된 데이터들만 rollback시켜주지, 모든 데이터를 rollback시킨다는 의미가 아니다. 위 사진에서 볼 ..

[Spring] 스프링이 태어난 이유_서블릿, JSP로 만든 MVC의 한계

김영한님의 스프링 입문과 기본편을 듣고, 스프링 mvc편을 들으며 Servlet, JSP를 하면서 느낀 점은 요즘은 스프링 프레임워크가 도입돼서 정말 다행이라는 점이다. 이렇게 느낀 이유를 아래에 포스팅해보겠다. Servlet을 하면서 사실 나는 6개월 정도 전에 Spring을 아예 모르고 단순히 웹개발을 해보고 싶다는 마음에 커리큘럼을 알아보다가 완전 쌩 Servlet부터 배워보려고 Servlet을 처음 접한 적이 있다. 그 때 당시 내가 짜던 코드는 회원가입 서비스를 만들어보려고 책을 참고해서 변형해 만들어본 코드였는데, MemberDAO, MemberVO, MemberServlet 세 개의 클래스 코드를 열심히 짠 기록이 깃헙에 남아있어 코드를 가져와보았다. 아래 코드는 HttpServlet을 상속..

[Spring] lombok의 @Builder와 JpaRepository를 도입해보았다

저번에 만든 회원 CRUD 프로젝트에 새로운 기능들을 추가하고 테스트코드를 돌려보았다. 기능들을 추가하면서 현재까지 내가 배운 것들을 포스팅해보겠다. @Builder, 왜 쓰는걸까? Getter, Setter를 쓰는 이유가 바로 필드변수를 함부로 수정하는 것을 방지하기 위해서인데, @Builder를 쓰는 이유 또한 그렇다. 우리는 흔히 lombok을 사용할 때, Entity 위에 @Getter를 사용하는 것은 많이 볼 수 있지만, @Setter를 사용하는 경우는 거의 보지 못했다. 나는 얼마전까지만 해도 @Setter를 사용하는 것이 테스트 코드 등 여러모로 편해서 자주 사용해왔었는데, 이 때 문제점이 발생한다. Setter 메소드를 사용하면, (lombok에서 아무런 설정을 하지 않는 이상) 다른 데서..

[Spring] CRUD 기능 실습 중 @DeleteMapping 관련 에러

저번에 포스팅한 CRUD 실습을 이어하던 중, @DeleteMapping으로 삭제하려던 중 아래 사진과 같은 에러가 발생하였다. This application has no explicit mapping for /error, so you are seeing this as a fallback. 1. 패키지 관계? 만약 스프링부트를 처음 실행했을 때 이 에러가 발생한다면 (또는 컨트롤러 메소드가 아무것도 실행이 안된다면) 위 에러는 보통 스프링부트 메인 클래스가 Controller, Service 등 스프링 빈들이 위치하고 있는 패키지의 상위 패키지에 없을 때 발생하는 에러라고 한다. 그러나 나는 @GetMapping은 실행이 잘되는 상황이기도 하고, 패키지 구조관계도 멀쩡했기 때문에 위와 같은 이유는 아니었..

[Spring] MySQL+JPA+Spring+Gradle 회원조회 Read 실습

환경세팅하는 부분은 이 포스팅에서 볼 수 있다. kth990303.tistory.com/46 [Spring] MySQL+JPA+Spring+Gradle 환경설정 및 실습 그동안 백준 풀면서 스프링 공부를 소홀히 한 게 느껴져서 오랜만에 스프링 공부도 할 겸, 간단한 회원조회 실습을 해보기로 했다. 말그대로 기초적인 간단한 실습을 복습 겸 하는거라, Domain에 M kth990303.tistory.com 아직 이 코드들은 github에 올리지는 않았다. github에 올리게 된다면 포스팅 수정 후 추가하겠다. MVC 디자인패턴을 최대한 준수하기 위해 위와 같이 Domain, Repository, Controller, Service로 나누어서 코드를 짰다. 회원 엔티티에 있어야 할 정보들을 살펴보기 위해 ..

반응형