legacy/Spring
-
[Spring] 이미지 또는 파일 다운로드legacy/Spring 2024. 1. 28. 18:25
이전에 이미지 파일을 업로드하는 방법을 알아보았습니다. 이번엔 업로드 한 파일을 다운로드하는 방법을 알아보겠습니다. 아래 사진을 보면 첨부 파일이 존재합니다. 첨부 파일을 다운받기 위해서는 서버에 저장된 경로에 접근해야 합니다. 이미지 파일을 업로드할 때 DB에서 파일이 저장된 경로도 저장하였으므로 이를 사용하면 됩니다. DB를 보면 STORED_FILE_PATH 컬럼에 서버 경로가 저장되어 있습니다. 파일을 다운 받는 과정은 다음과 같습니다. 업로드된 파일이 저장된 서버 경로를 가져온다 UrlResource를 사용하여 "file: 서버 경로"를 등록한다 ResponseEntity의 Header를 반드시 생성한다. 이미지 파일을 정상적으로 다운로드하게 됩니다.
-
[Spring] 이미지 및 파일 등록 , MultipartFilelegacy/Spring 2024. 1. 28. 18:00
이미지 등록 form 게시물을 등록할 때 첨부파일을 추가할 수 있도록 다음과 같이 작성합니다. form: enctype="multipart/form-data" input type: "file" 태그를 보면 enctype="multipart/form-data"를 사용하고 있습니다. form을 통해 보내는 데이터는 문자, 이미지 파일입니다. binary 값과 문자를 동시에 전송하기 위해서는 enctype을 추가해주어야 합니다. Controller form으로 전송된 binary와 문자값을 받기 위해서는 MultipartFile을 사용합니다. MultipartFile에는 업로드한 파일 이름, contentType, 서버에 파일 전송 등 다양한 기능을 제공합니다. Service Controller로부터 받은 ..
-
[Spring] 타임리프 th:each index를 javascript로 넘기기legacy/Spring 2024. 1. 25. 14:07
Controller에서 Model에 담아 전달한 값을 타임리프(Thymeleaf)를 사용하여 다루곤 합니다. Model에 List를 담아 전달하면 타임리프에서 th:each 문법을 사용하여 여러 개의 값을 편하게 출력할 수 있습니다. 문제 발생 저는 List를 담고 있는 Model의 값을 꺼내어 타임리프에서 다루고자 하였습니다. 코드는 다음과 같습니다. html Model에 담긴 List의 값을 하나씩 꺼내어 작성자와 작성일자를 출력하고 있습니다. 빨간 박스를 보면 id값으로 commentCreatedDate와 commentContent를 사용하고 있습니다. 여기서 잘못된 것이 있는데 List의 크기가 2개 이상이면 동일한 id값이 2번 이상 사용됩니다. id는 유일해야 하기 때문에 잘못된 코드입니다..
-
[Spring] API 통신시 Entity에 직접 접근하지 말자legacy/Spring 2024. 1. 7. 16:02
뷰템플릿을 사용하여 통신할 수도 있지만, 프론트 또는 앱과 API 통신을 통해 데이터를 주고받기도 한다. 이때 API 스펙을 작성하여 요청 정보와 응답 정보를 작성하게 된다. API마다 요청과 응답 정보가 다르기 때문에 Entity에 직접 접근해서는 안 된다. 그 이유를 알아보자. 다음은 회원에 대한 Entity이다. 고유 번호, 이름, 주소, 주문 정보 필드를 가지고 있다. @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mapped..
-
[Spring-Error] java.sql.SQLException: Generated keys not requested.legacy/Spring 2023. 11. 5. 13:09
원인 DB에서 기본키를 자동으로 증가하는 전략을 사용할 때, 서버에서 DB에 등록된 키를 가져오지 못해서 발생하는 오류 코드 public Long enrolBoard(BoardEnrolDto boardEnrolDto) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement stmt = connection.prepareStatement("INSERT INTO Board(title, name, content, created_date, view_cnt) VALUES(?, ?, ?, ?, ?)"); stmt.setString(1, boardEnrolDto.getTitle()); st..
-
[Spring] Builder 패턴을 사용해야 하는 이유를 알아보자legacy/Spring 2023. 11. 5. 02:11
사건의 발달 게시판에 글을 작성하였을 때, 등록된 시간이 Timestamp 값을 사용하기 때문에 다음과 같이 출력되었습니다. MySQL에서 등록일(created_date) 필드를 TimeStamp 타입을 사용하였고, 자바에서도 TimeStamp 타입을 사용하여 값을 받았습니다. MySQL Board Class 게시판 글 조회 문제 해결 저는 "2023년 11월 04일 22시 08분"으로 출력을 원했기에 다음과 같이 코드를 수정하였습니다. Board Class TimeStamp -> String 타입으로 포맷팅을 하기 위해 SimpleDateFormat 클래스를 사용하였습니다. 또한 생성자로 필드 값을 먼저 설정한 후, 추가적으로 포맷팅 된 값을 저장해야 하기 때문에 Setter가 필요하게 된 상황이 되었..