Java/Spring (10) 썸네일형 리스트형 SpringBoot Bean 중복 처리(필드명 수정을 통한 방법) 인터페이스를 사용하다보면 같은 반환 타입을 가진 bean을 설정할 때가 분명히 있다. 이 경우 정확히 명시해주지 않으면 Spring은 다음과 같은 에러를 띄운다. 위 에러는 TestController가 요청하는 bean은 하나인데 반해, 같은 반환 타입을 가진 bean이 세 개 발견되어 나타나는 에러이다. 정확히 어떤 bean을 사용할 것인지 반드시 제대로 설정을 해줘야 한다. 친절하게도 Spring에서 친절하게 해결 방안을 알려준다. @Primary와 @Qurlifier을 이용한 우선순위를 정하는 방법이 가장 많이 쓰이는 것으로 알고 있다. 난 위 두 어노테이션의 힘을 빌리기보다 매우 기본적인 방법으로 bean의 중복을 처리하고자 한다. 위 두 가지의 bean이 존재한다. 인터페이스의 구현체 2 종류로.. Spring Boot + MyBatis 스프링부트를 사용할 때 거의 JPA만 사용했었는데, 때에 따라 MyBatis도 사용하면 괜찮을 것 같았다. 실제로 여러 개발 블로그를 보니 혼용으로 사용하는 분들이 꽤나 많았기에 나도 한 번 그렇게 해봐야겠다라는 생각이 들었고.. 시작이 반이다라는 느낌으로 Spring Boot + MyBatis를 어떻게 사용하는지 간략하게 기록해본다. 1) build.gradle 참고로 현재 Spring Boot와 jsp, Mybatis를 혼용해서 공부를 하고 있다. 그래서 스프링에서 jsp 사용을 위한 tomcat-jasper가 디페던시 되어있고 나머지 mysql과 mybatis를 설정해주도록 하자. 참고로 순서는 뭐가 먼저고 그런건 없으니 그냥 참고.. 2) application.properties spring에게 .. @JsonManagedReference와 @JsonBackReference 프로젝트 중 양방향 관계에 있어 순환참조가 반복됐다. 순환참조가 발생하여 결국 스택 오버 플로우에 빠지게 됐고 프로그램을 정상적으로 실행하지 못하게 된 상황. 이는 A가 B를 부르고 B가 A를 부르게 되면 나오는 상황이다. 끝없이 부르게 되니 스택 오버 플로우에 빠지게 된 셈. 이를 해결하기 위해 DTO에서 필요한 데이터만 응답하게끔 바꾸는 방법도 있지만, 스프링의 Jackson 라이브러리의 @JsonManagedReference와 @JsonBackReference 어노테이션을 사용하여 위 상황을 방지할 수도 있다. 먼저 순환참조가 일어났을 때 에디터 및 포스트맨에서 어떤 반응이 나오는지 살펴보자. 게시글 엔티티와 댓글 엔티티를 만들어 게시글 1 : 댓글 N 관계로 맵핑하였다. // 게시글 엔티티 @On.. @JoinColumn(mappedBy)과 연관 관계의 주인 @JoinColumn은 외래키를 지정할 때 사용되는 어노테이션이다. 외래 키는 1:N 관계에서 N 부분에 지정해준다. 이유는 데이터베이스는 컬렉션을 담을 수가 없기 때문이다. 컬렉션이라고 하면 자바의 List나 Map과 같다고 보면 된다. 따라서 N 부분에 외래키를 지정해주고, 그 필드 데이터에 @JoinColumn을 설정해주도록 하자. // UserEntity 에서의 PhoneNumber 설정 @OneToMany(mappedBy = "user") private List phone = new ArrayList(); // PhoneEntity 에서의 User 설정 @ManyToOne @JoinColumn(name = "user_id") private User user; 한 사람은 여러 가지의 핸드폰을 가질.. Spring + MySQL 연동 개발에 있어 가장 중요한건 아무래도 설정이 아닐까 싶다. 웹 개발을 하기 위해 쓸 백엔드의 Spring과 DB로 사용할 Mysql을 연동하는 기록을 남겨본다. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/DB명?serverTimezone=UTC&characterEncoding=UTF-8 spring.datasource.username=아이디 spring.datasource.password=비밀번호 먼저 resourse 폴더 아래의 application.properties에 간단한 설정을 해준다. 위 내용은 mysql 드라이버를 사용하고 url을 설정하며.. @RequestParam과 @PathVariable 복습하던 중 까먹으면 안 될 것 같아 기록을 남겨본다. @RequestParam과 @PathVariable 어노테이션은 스프링 컨트롤러 단에서 많이 쓰이는 어노테이션이다. 두 어노테이션은 데이터의 전달을 위해 사용된다. Http에서 요청 간 데이터를 보장해주지 않기 때문에 이 데이터를 보관하고 있어야 할 곳이 필요하다. 따라서 스프링은 위 어노테이션들을 이용하여 url에 값을 전달하여 데이터를 전달할 수 있다. 가장 큰 차이점은 @PathVariable은 어떤 요청을 하던 딱 하나만 사용할 수 있다는 점이다. 반면 @RequestParam의 경우 여러가지 매개변수를 통해 요청을 여러개 해줄 수 있다. 아래 코드를 보자. @RestController @RequestMapping("test") public .. Junit 테스트 TDD(테스트 주도 개발)에 앞서 가장 중요한 라이브러리 Junit을 공부하며 일단 간략하게 기록하고자 한다. 코드는 따로 없고 원리에 대해서만 기록한다. 스트링부트는 자체적으로 test 폴더를 구비하고 있다. 이 폴더 아래로 테스트 개발을 시작하면 된다. 코더가 작성한 클래스를 import 하여 상황 별 샘플 코드를 작성하여 테스트 한다. Junit을 쓰는 이유는 main 메서드 작성 필요없이 간단하게 코드를 테스트 할 수 있기 때문이다. 단 문제점이 있다. 만일 같은 객체를 여러 테스트 메소드가 나누어 쓰게 되면 발생하는 문제이다. 회원가입이 구성된 사이트의 Repository를 테스트 하기 위해 여러 테스트 메소드에 작성했다고 하자. Repository에는 유저에 대한 정보를 담기 위해 save, .. @ResponseBody @ResponseBody는 HTTP body 부분의 데이터, 즉 JSON으로 넘어온 객체의 데이터라던지, 아니면 직접 페이지로 출력할 수 있다. @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name) { return "hello " + name; } 결과 다음은 객체로 넘어온 데이터를 반환한다. @GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name) { Hello hello = new Hello(); hello.setName(name); return hello; .. 이전 1 2 다음