ModelMapper란? "서로 다른 클래스의 값을 한번에 복사하게 도와주는 라이브러리" 어떤 Object(Source Object)에 있는 필드 값들을 자동으로 원하는 Object(Destination Object)에 Mapping시켜주는 라이브러리이다. ModelMapper 공식 문서 사용하는 이유 DTO와 같은 클래스로 데이터를 받은 후 원하는 클래스(엔티티)에 넣어줄 때, 보통 Getter와 Setter를 이용해 필드를 하나씩 복사, 붙여넣기 하는 작업을 거친다. 이때 문제가 발생한다. 매우 귀찮다. 실수할 가능성이 크다. input과 output과 repository에 저장되는 data의 모델링이 다른 경우가 많다. 즉 다른 모델의 object를 변환해줘야 하는 작업이 빈번하게 발생한다. 필드가..
Spring
스프링 부트에서 프론트엔드를 관리하는 방법 프로젝트 내부에 패키징하지 않고 관리: 외부에서 받아오기, 트래픽 분산 CDN 프로젝트 내부에 패키징하여 관리 WebJar NPM NPM is better than WebJar: 대중적으로 많이 쓰이지 않는 라이브러리는 버전 업데이트 등 관리가 잘 되지만 대부분 라이브러리가 관리되지 않고 있다. NPM 라이브러리 관리 npm으로 라이브러리를 관리한다는 것은 package.json으로 dependencies를 관리하는 것을 말한다. npm install로 의존성을 설치한다. npm으로 라이브러리를 관리하기 위해서는 다음과 같은 단계를 거쳐 설정을 해주어야 한다. 1. 프론트엔드 라이브러리 위치 설정 2. HTML에 경로 작성 3. build.gradle plugi..
javax.validation javax.validation 라이브러리는 위와 같은 어노테이션들을 지원해준다. 검증하고자 하는 객체의 필드에 위 어노테이션을 추가해주면 이 객체가 파라미터로 들어올 때 @Valid를 추가해줌으로써 검증할 수 있다. 또 이 파라미터 바로 뒤에, Errors errors 파라미터를 추가해주면 검증 시 발견된 에러를 가지고 올 수 있다. SignUpForm 객체가 유효하지 않다면 bindingResult.hasErrors() 메소드에서 true가 반환된다. SignUpForm이 유효하지 않다면 Responseentity에 BAD_REQUEST와 bindingResult.getAllErrors()값을 넣고 생성하여 반환된다. Spring boot 2.3 이상부터! 기존에는 org..
과거에는 xml파일을 이용해 Java config, 즉 설정 파일을 수정했는데 스프링 프로젝트의 크기가 점점 커지고 IDE의 도움을 받을 수 없다. (오타, 자동완성) 그래서 @Configuration어노테이션을 사용해 클래스 파일을 설정파일로 사용하게 되었다. @Configuration 스프링 설정용 클래스라는 의미를 가진다. @Configuration가 붙어 있는 클래스 내부에 @Bean메소드가 있을 때, 이 메소드들을 자동으로 실행하여 반환되는 객체를 싱글톤으로 등록해준다. @Bean메소드만으로도 Bean 등록이 되지만 싱글톤을 보장하지 못한다. 그래서 @Bean메소드를 포함하는 클래스는 항상 @Configuration어노테이션을 사용해준다. 참고로 @Configuration 어노테이션 내부에도 @..
@Bean어노테이션과 @Component어노테이션 모두 spring(IOC) container에 bean을 등록하도록 하는 어노테이션이다. 하지만 두 어노테이션의 용도가 다르다. 이 차이점을 알아보겠다. 결론 @Bean: 개발자가 작성한 메소드를 통해 반환되는 객체를 Bean으로 등록 @Component: 개발자가 직접 작성한 class를 Bean으로 등록 @Bean @Bean: 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들고 싶을 때 사용 @Bean public ObjectMapper objectMapper() { return new ObjectMapper(); } @Bean public RestTemplate restTemplate() { return new RestTempla..
Spring에서 컨트롤러를 지정해주기 위한 어노테이션으로는 @Controller와 @RestController가 있다. @Controller는 spring 2.5버전부터 지원됐고 @RestController는 그보다 늦은 spring 4부터 지원을 시작했다. 결론부터 말하자면 @RestController = @Controller + @ResponseBody 이다. @Controller Controller - view반환 @Controller는 주로 view를 반환하기 위해 사용한다. @Controller가 view를 반환하는 과정은 다음과 같다. 1. 사용자가 URI형식으로 웹 서비스에 요청을 보낸다. 2. DispatcherServlet이 요청을 인터셉트하여 mapping되는 Handler를 찾는다. ..
@Data 지양 @Data는 많은 어노테이션들(@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor)을 갖고 있는 어노테이션이다. 그만큼 강력하고 편리하지만 그에 비례하여 부작용도 많아 사용 시 주의를 기울여야 하는 어노테이션이다. @Setter남용 @Data에는 @Setter가 포함되어 있기 때문에 객체를 언제든 변경할 수 있는 상태가 된다. 그만큼 객체의 안정성이 보장받기 어렵게 된다. @ToString으로 인한 양방향 연관관계시 순환 참조 문제 두 엔티티가 서로 양방향 연관관계일 때 @ToString을 호출하면 무한히 순한 참조가 발생한다. 해결방법 엔티티 선언 시 @ToString(exclude="{순환참조 되는 필드}..
동일성과 동등성 equals()와 hashcode()를 이해하기 전에 먼저 동일성과 동등성에 대한 개념을 짚고 넘어가야 한다. java의 모든 클래스는 Object클래스를 상속받는데 이 클래스의 멤버 메소드로 equals() 메소드가 있다. equals()메소드는 참조 값(객체 주소 값)이 같은지 확인하는 기능을 한다. 그렇다면 이 메소드는 ==과 무엇이 다를까? 동일성 동일성 비교는 객체 인스턴스의 주소 값을 비교하는 것을 말한다. 동일성 비교시에는 ==을 사용해 비교한다. primitive data type의 경우 동일성 비교를 통해 값 비교가 가능하다. 동등성 동등성 비교는 객체 내부의 값을 비교하는 것을 말한다. 동등성 비교시에는 equals()메소드를 사용해 비교한다. 주로 primitive d..
스프링 데이터 JPA 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 org.springframework.data.jpa.repository.support.SimpleRepository SimpleJpaRepository 구현 분석 @Repository 적용 JPA 예외를 스프링이 추상화 한 예외로 반환 JPA가 아닌 다른 시스템의 예외도 동일한 형태로 추상화를 함 시스템에 종속적이지 않은 코드 구성 가능 @Transactional트랜잭션 적용 JPA의 모든 변경은 트랜잭션 안에서 동작 서비스 계층에서 트랜잭션 시작 X: 리파지토리에서 트랜잭션 시작 서비스 계층에서 트랜잭션 시작 O: 해당 트랜잭션을 이어받아 사용 SimpleJpaRepository에 구현된 메소드들이 이미 트랜잭션 안에서..
사용자 정의 리포지토리 리포지토리에 원하는 기능만 구현하여 사용하고 싶을 때, 직접 구현하면 인터페이스에 구현해야 하는 기능이 너무 많다.(인터페이스이기 때문에 모든 메서드 구현 필요), 이를 사용자 정의 리포지토리로 해결한다. 대부분 이 방법은 복잡한 쿼리를 Querydsl로 풀 때 사용된다. 사용자 정의 인터페이스 이름과 구현 클래스 이름이 비슷하므로 더 직관적 여러 인터페이스를 분리해서 구현하는 것도 가능하기 때문에 새롭게 변경된 이 방식을 권장 기존 리포지토리에 이 인터페이스를 상속받아 사용 public interface MemberRepository extends JpaRepository, MemberRepositoryCustom //사용자 정의 인터페이스 public interface Memb..