목록프로그래밍 (409)
쌓고 쌓다
로컬에서는 다른 로그를 남기고 실제 운영에서는 다른 로그를 남기길 원한다면 다음과 같이 설정하면 된다. application.properties spring.profiles.active=local 값에 자신만의 환경 이름을 적어주자. 로컬 환경이라 local로 작성해주었다. 매번 입력하기 귀찮다면 다음과 같이 실행 또는 빌드시에 설정값을 지정할 수 있다. 이제 우리가 입력한 spring.profiles의 값에 따라 logback.xml의 동작을 결정할 수 있다. [%d{yyyy-MM-dd HH:mm:ss}:%-3relative]%-5level - %msg%n springProfile name="값" : application.properties에 설정한 값으로 동작할 수 있다.
Slf4j는 라이브러리 인터페이스이고, 그 구현체로 LogBack이 있는것이다. resources 아래에 logback-spring.xml 파일을 생성하고 작성하여 로그 설정을 한다. LogBack은 Error > Warn > Info > Debug > Trace 순으로 로그 레벨이 나눠진다. logback-spring.xml 의 전체 코드를 이해하기전 부분부분 이해해보자. [%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{36} - %msg%n appender : 로그의 형태, 로그 메시지를 콘솔에 출력할지 파일로 출력할지 출력 대상을 정할 수 있다. name : STDOUT이라는 이름으로 변수를 저장했다고 생각하면 된다. class : ..
게시글, 게시글 좋아요, 회원 테이블이 관계를 맺고있는 상황이다. 이때 다음과 같이 임시 데이터를 생성하고 필요한 필드들만 관계 매핑을하고 QueryDSL로 쿼리를 날렸다. //given Member posterLiker = new Member(); memberRepository.save(posterLiker); Poster poster1 = new Poster(); Poster poster2 = new Poster(); posterRepository.save(poster1); posterRepository.save(poster2); PosterLike posterLike1 = new PosterLike(); posterLike1.setPoster(poster1); posterLike1.setMember..
댓글과 댓글 좋아요가 1:N으로 관계를 맺고 있는 상태이다. 즉, 댓글 좋아요에서 댓글PK를 외래키로 갖고 있다. Comment @Entity @Data public class Comment { ... @OneToMany(mappedBy = "comment", cascade = CascadeType.REMOVE) private List commentLikes = new ArrayList(); } CommentLike @Entity @Data public class CommentLike { ... @ManyToOne @JoinColumn(name = "comment_id") private Comment comment; } 실행한 테스트 코드는 다음과 같다. @Test @DisplayName("댓글 삭제")..
API의 응답으로 위와 같이 JSON 데이터를 받는다. 나는 response -> body -> items -> item의 List를 받길 원한다. JSON의 List는 어떻게 처리할 수 있을까? 테스트용으로 데이터의 contentid만 받아서 저장해보자. 다음과 같이 클래스를 만든다. @Data @JsonIgnoreProperties(ignoreUnknown = true) public class LocationId { private String contentid; } JsonIgnoreProperties(ignoreUnknow) : item 리스트의 원소 데이터에 contentid 외에도 많은 필드들이 있다. 만약 내가 원하는 필드만 바인딩하길 원한다면 이 옵션을 주면 된다. 이 옵션을 쓰지 않는다면 ..
테스트 코드를 작성하며 실제로 업로드한 파일이 서버와 디스크에 저장되는지 확인할 필요가 있었다. 다음 메서드를 호출하여 정상적으로 파일이 저장되길 원한다. public Location addLocation(Location location, List files) List은 어떻게 생성해서 넘거야할까? 다음과 같이 MockMultipartFile을 사용하여 MultipartFile을 대체할 수 있다. String imgName1 = "abc1.jpg"; String imgName2 = "abc2.jpg"; MockMultipartFile file1 = new MockMultipartFile(imgName1, imgName1, MediaType.IMAGE_JPEG_VALUE, "img".getBytes());..
테스트 코드를 작성하는중에 문제가 발생했다. 먼저, 장소와 게시글의 관계는 1:N 관계이다. 다음의 테스트 코드를 보자. Location location = new Location(); location.setTitle("테스트 장소"); locationRepository.save(location); Poster poster = new Poster(); poster.setTitle("게시글1"); poster.setLocation(location); posterRepository.save(poster); Poster poster2 = new Poster(); poster2.setTitle("게시글1"); poster2.setLocation(location); posterRepository.save(post..
테스트 코드를 작성하던 중 NPE가 발생했다. List locationImages = location.getLocationImages(); for (LocationImage locationImage : locationImages) { imageStore.deleteLocationImage(locationImage); } get 메서드를 호출하여 반환받은 List를 탐색하는 코드이다. 여기서 반환 받은 컬렉션이 NULL이라면 난 NPE가 발생하지 않고 반복문만 돌지 않을거라 생각했었다. List를 탐색하는 로직이 존재할 수 있으니 엔티티의 List와 같은 컬렉션 필드는 new로 컬렉션을 초기화해주는 것이 좋다. 그리고 컬렉션을 초기화해주면 좋은 이유가 한가지 더 있다. 나중에 임의로 개발자가 초기화하게 된..