Spring
-
DTO 사용범위Spring 2021. 9. 5. 21:56
데이터를 클라이언트와 서버가 주고받을 때 DTO를 사용하다보니, DTO의 사용범위가 controller와 service사이에서 어디까지 사용하는 것이 옳은 것일까하는 의문이 들었다. DTO DTO는 Data Transfer Object로 계층간 데이터 교환을 위해서 사용하는 객체이다. 엔티티를 그대로 외부에 노출하게 되면, 모든 속성이 노출되고 엔티티가 변경될 위험이 있기 때문에 model, view 분리원칙에도 영향이 갈 수 있다. DTO를 사용해서 model정보를 캡슐화하고 선택적 정보선택을 통해서 꼭 필요한 정보만 보내주도록 해준다. Service layer 다음의 블로그 글을 읽고 controller가 사용되지 않는 model정보를 추가로 가져오고 이용해서 여러 service에 의존해서 DTO를 ..
-
No serializer found for class Exception 에러 해결방법Spring 2021. 9. 5. 21:42
다대일, 일대일 관계의 설정에서 no serializer 에러가 나는 경우를 확인해보자. No serializer found for class Exception 엔티티 매핑 설정에서 fetch타입이 Lazy로 설정되어서 데이터가 아직 넘어오지 않았을 때 발생하는 에러이다. repository findby를 이용할때 발생되는 경우가 많다. 이러한 경우 해결방법이 3가지가 존재한다. ㉮ @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}), @JsonIgnore 어노테이션을 통해서 오류나는 매핑 엔티티 설정 바꿔주기 ㉯ LAZY설정된 엔티티를 EAGER로 바꿔서 가져오기 ㉰ application 파일안에 spring.jackson.serializat..
-
@ManyToMany, @OneToMany, @ManyToOne관계 작성하기Spring 2021. 9. 5. 21:33
엔티티 매핑을 하다보면 엔티티와의 관계가 1:N, N:1이 아닌 N:N의 관계를 가진 경우가 존재한다. (ex. 팀-회원의 관계) 이러한 경우 다:다 의 관계로 매핑되는데, 이럴경우 조회 쿼리, 외래키를 어디에 위치시키는 가에 대한 여부를 알아본다. @ManyToMany 관계 조인테이블에서 데이터정보의 추가와 부가기능추가는 불가능해지기 때문에, 다대다 관계는 권유되지 않는다. 실무에서는 일대다, 다대일-다대일, 일대다의 관계로 풀도록 가운데 엔티티를 추가해서 풀어주도록 한다. 엔티티 설정 유저와 팀의 엔티티에 다음과 같이 작성해준다. 멤버와 팀은 서로 다대다 관계이다. 외래키는 user가 가지고 있기 때문에 다대다 관계의 매핑정보를 수정하기 위해서는 user측에서 다음과 같은 addTeam의 함수를 이용..
-
MultipartFile 파일업로드(with. react)Spring 2021. 9. 5. 20:49
spring에서 파일업로드 기능을 실행해보자. 파일을 저장하기 위해서는 spring프로젝트 내부에 파일저장 폴더가 위치해야 한다. File Upload Utils 먼저 파일을 업로드하는 util코드를 작성해준다. saveFile을 이용해서 파일폴더가 존재하지 않으면 폴더를 만들어주고 파일을 저장한다. cleanDir는 프로필이미지를 저장하는 경우에 아이디를 이용한 폴더안에 이미 파일이 존재하면 기존파일을 삭제한 후에 새로 파일을 저장해준다. import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import ja..
-
예외처리전략 (Exception Handler)Spring 2021. 9. 5. 20:25
스프링에서 예외처리를 해주자. 예외발생 데이터타입을 일관된 형태로 생성해서 반응하도록 설정해준다. Error Response 먼저 예외의 형태를 잡아주는 클래스를 작성해준다. 메세지와 상태, 시간정보를 담고있다. 발생된 에러를 다음의 형태로 반환할 것이다. import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor public class ErrorResponse { private String message; private int status; private long timestamp; } Global Exception Handler 발생된 예외 형태에 따라서 처리를 해주는 exception handler를 작성해준다. @Co..
-
JWT 토큰을 이용해서 로그인 인증 구현하기Spring 2021. 9. 5. 18:27
회원의 로그인정보를 통한 authentication을 구현해보자. Authentication 로그인 인증 구현 방식에는 session cookie 방식과 jwt 토큰 방식이 존재한다. session cookie 방식은 사용자에 따라서 고유의 session ID가 발급되며 유의미한 정보를 담고 있지 않기 때문에 쿠키방식보다는 안전하지만, 세션저장소에 모두 담아두기 때문에 다수의 요청이 발생시 부하가 발생할 수 있다. JWT 세션쿠키와 하게 인증에 필요한 정보들을 암호화한 토큰을 사용하는 방식으로, 비밀키가 유출되지 않는 이상 토큰을 복호화 하지 못하므로 보안이 유리하다. access token의 기한은 유효하지만, access token이 만료되기전에 사용자가 로그인하면 refresh token을 이용해서..
-
WebSocket 사용해서 react와 함께 채팅구현하기 (Stomp사용하기)Spring 2021. 9. 5. 17:30
nodejs에서 socketio를 이용해서 클라이언트와 서버의 채팅을 구현한다면, spring에는 stompjs가 존재한다. STOMP stomp는 websocket와 같이 양방향(클라이언트-서버)네트워크 프로토콜로 HTTP에서 모델링되는 프레임기반의 프로토콜이다. spring에서 stomp를 사용한다면, spring websocket 어플리케이션은 Stomp Broker로 작동하게 된다. websocket에서는 text나 binary데이터를 전송하면서 추가적인 정보(예를들면, 어디로 route하고 어떻게 처리할지)의 부재로 추가코드작성이 불가피해진다. 이를 해결하기위한 서브프로토콜이 stomp이다. stomp덕분에 CONNECT, SUBSCRIBE, UNSUBSCRIBE, ACK, SEND와 같은 웹소..
-
@Many to Many 혹은 연관관계에서 stackOverFlow 에러 발생시Spring 2021. 8. 17. 11:19
연관관계 매핑시에 lombok의 데이터 사용시 내부적으로 toString을 불러내면서 연관관계의 객체를 연속해서 불러내게 된다. 이때 stackOverFlow 에러가 발생하게 되므로 롬복의 Data-> @Getter, @Setter로 변경해준다. (참고) https://stackoverflow.com/questions/17445657/hibernate-onetomany-java-lang-stackoverflowerror Hibernate OneToMany java.lang.StackOverflowError It's my first question here on stack, so please be gentle :D I'm trying to create hibernate OneToMany relationsh..