본문 바로가기
관리자

Programming-[Backend]

(421)
[JPA기본] 1. JPA 필요성 : 객체와 RDB의 패러다임 불일치 1. JPA란 JPA는 SQL(Structured Query Language) 중심적인 개발을 대체해주는 ORM(Object Relational mapping) 이다. 객체 지향적인 개발 스타일을 유지하면서 데이터 베이스와의 상호작용이 가능하도록 해준다. 객체와 데이터베이스의 관계를 매핑 해주는 것이 ORM이다. 객체 지향적 언어인 자바와 관계형 데이터 베이스(RDB, Relational DataBase)간에는 다음 섹션에서 다룰 패러다임 불일치의 문제가 있는데, 여기서 발생하는 개발에서의 생산성 저하 문제를 해결해주는 도구라고 할 수 있다. 원래 SQL 중심적인 개발에서는 정보를 저장하는 테이블마다 반복적으로 CRUD에 해당하는 SQL 코드를 작성해야만 했다. 객체는 어떤 데이터의 속성과 기능을 갖고 ..
[스프링 웹MVC-2] 21. 업로드, 다운로드 기능 구현 예제 여러 개의 파일을 한 번에 업로드 하는 방법, 업로드 파일을 브라우저 상에서 확인하도록 하는 방법, 다운로드 하는 방법에 대해서 학습해본다. 기존 파일에 도메인 코드를 추가하여 진행한다. 각 메서드나 방법론 보다는 전체적인 파일 전송 방식에 대한 이해가 중요하다. 1. 도메인 생성 Item 클래스의 필드값은 상품의 이름, 다운로드할 수 있는 상품 이미지, 조회했을 때 표시되는 이미지 리스트를 필드값으로 한다. 그리고 업로드된 파일의 이름을 저장할 수 있도록 UploadFile 클래스를 만든다. java/hello/upload/domain/Item.java 1 2 3 4 5 6 7 8 9 @Data public class Item { private Long id; private String itemName..
[스프링 웹MVC-2] 20. 파일 업로드 1. 파일 전송 시 HTTP 작동 방식 보통 파일 업로드를 위해서 HTML Form을 이용한다. 이때, 아래 그림과 같이 단순 text를 보낼때는 x-www-form-urlencoded로 보내지만, text와 binary 데이터를 같이 보내야 하는 경우처럼 여러 타입의 데이터를 함께 보내야 하는 경우, multipart/form-data로 넘어가고 boundary, filename 등 부가적인 정보가 붙어서 HTTP 요청이 생성된다. 뒤에서 다루겠지만, boundary로 나눠진 부분들을 parts로 표현하며, request.getParts()로 각 부분을 얻을 수 있다. 이런 기본적인 내용을 숙지하였으니, 파일 업로드를 실습해보자. 2. 서블릿의 multipart 요청 정보 처리 multipart 요청 ..
[스프링 웹MVC-2] 19. 타입 컨버터 - Formatter 1. 포맷터(Fomatter)란? 지난 글에서 학습한 Converter의 세부적인 개념이다. 특히나 금액, 날짜와 같은 자주 쓰는 타입에 대해 지역 정보(Locale)를 바탕으로 객체 문자 간 특화된 변환을 지원한다. 스프링에서 제공하는 Formatter를 살펴보면 Printer, Parser 객체를 상속받는 것을 볼 수 있다. 각각의 메서드 중 print 메서드는 객체를 문자로 변경하고, parse 메서드는 문자를 객체로 변경하는 역할을 한다. 2. Formatter 사용 직접 사용해보기 Formatter를 사용하는 기본적인 방법에 대해 알아본다. 테스트 코드로 위에서 다룬 print, parse 메서드를 연습한다. org.springframework의 Formatter를 상속받고, 타입은 Number..
[스프링 웹MVC-2] 18. 타입 컨버터 - ConversionService HTTP 요청을 통해 서버로 넘어온 정보 중, 서버에서 원하는 타입이 아닌 정보가 있을 수 있다. 각 필드들을 원하는 타입으로 변환하는 자바 코드를 사용해도 되지만, 스프링에서 제공하는 타입 컨버터 기능을 사용하면 자동으로 타입 변환이 되도록 할 수 있을 뿐만 아니라 사용자 지정 타입의 필드값으로 변경할 수 있는 등 여러 가지 장점이 있다. 1. 프로젝트 생성 아래 사진과 같이 생성하고, 늘 했던 방식과 같이 Build는 intelliJ가 하도록, Encoding은 UTF-8형식, Annotation Processor를 사용할 수 있도록 설정해준다. 2. Converter 인터페이스 스프링의 기본 타입 변환 지원 스프링은 기본적인 타입 변환은 자동으로 지원한다. 아래 예시를 보자. helloV1 컨트롤러..
[작성중][TIL][링크]Entity에 cascade=CascadeType.PERSIST 사용 시 주의 1:N의 관계를 갖는 A.class와 B.class가 있는 경우, @OneToMany(fetct=FetchType.LAZY, mappedBy = "...", casecade = CascadeType.PERSIST) private List Bs; CascadeType.PERSIST를 하면, A 타입만 JPA를 통해 영속성 객체로 불러오더라도, B 타입도 영속성 객체로 함께 불려오게 된다. 이것 때문에 엄청 오래 삽질을 했다... 정확한 원리는 아직 모르겠지만, 둘 다 영속성 객체로 걸려있으면 실제 SQL로 CRUD 시에 서로의 값을 참조하면서 무조건 넣어주어야 하는 것 같다. 링크 내용을 읽고 향후 JPA 개념이 생기면 정확하게 이해하자! 참조 [1] [jpa] CascadeType.PERSIST를 함부로..
[TIL] Mapstruct - @Mapping 시 List의 필드값, the type of parameter has no property named Mapstruct에서 @Mapping 사용 시 source와 target에서 필드값들을 매핑할 때, "the type of parameter has no property named" 에러가 나는 경우가 있다. 이것은 source와 target 경로 지정 시, Collection 타입이 아닌 부분을 조회하여 발생했을 수 있다. 이것은 마치 List 타입 내부의 size를 알 수 없는 객체들을 또 다른 size를 알 수 없는 List의 객체들로 매핑하는 것이 되기 때문이다. 요약하자면 아래 그림과 같다. 그럼 어떻게 해야할까? general 객체용 Mapper를 하나 만들어서 매핑하고, Soldier 객체용 Mapper를 만들어서 매핑을 반복적으로 수행한 뒤, 최종 general 객체로 합치면 된다. 정확한..
[스프링 웹MVC-2] 17. API 예외 처리 - 스프링 ExceptionResolver 이전 글에서 Exception을 직접 처리하는 ExceptionResolver를 만들어보았다. Exception 종류에 따라 statusCode와 message를 넣은 뒤, ModelAndView를 반환하는 방식으로 진행했다. 이번에는 직접 만들지 않고, 스프링이 제공하는 ExceptionResolver를 편리하게 사용해본다. 1. 스프링 부트가 제공하는 ExceptionResolver 종류 스프링 부트에는 HandlerExceptionResolverComposite 이라는 파일에 다음 순서로 ExceptionResolver 들이 등록되어있다. 1. ExceptionHandlerExceptionResolver 2. ResponseStatusExceptionResolver 3. DefaultHandlerE..