Backend (20) 썸네일형 리스트형 [JPA] 테스트 코드에서 JPA + @Trasnactional 사용 시 주의점 예제 코드Member.classupdateUsername()을 통해 사용자의 이름을 변경할 수 있다.@Entity@Setter@Getterpublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String username; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @JoinColumn(name = "member_id"), inverseJoinColumns = @JoinColumn(name = "pr.. TDD (Test-Driven Development) TDD란?프로덕션 코드를 먼저 작성하는 것이 아닌 테스트 코드를 먼저 작성한다. RED : 테스트에 실패하는 코드를 작성한다.테스트할 프로덕션 코드가 없기 때문에 에러가 발생한다.GREEN : 테스트를 통과할 수 있도록 최소한의 코드만 작성한다.프로덕션 코드가 엉터리여도 된다. 단순히 테스트 통과만을 위한 프로덕션 코드를 작성한다.BLUE : 테스트 통과는 유지하면서 프로덕션 코드를 개선한다. TDD - REDcalculateTotalPrice()는 프로덕션에서 실제로 사용할 코드에 대한 테스트 코드를 작성한다. CafeKiosk 클래스의 calculateTotalPrice() 메서드는 아직 작성되지 않은 상태이다.@Testvoid calculateTotalPrice() { CafeKiosk ca.. [Java] Optional로 null 데이터를 다룰 때 안티 패턴을 주의해야 한다. 사용자의 입력은 믿을 수 없는 정보이다.사용자 입력에서 발생할 수 있는 예외 케이스를 고민해야 한다. 그리고 예외 케이스에 대한 검증이 필요하다.ex) 이메일 입력창에 특수 문자를 입력할 수 있다. null을 대하는 자세→ 항상 NPE를 방지하는 방향으로 경각심을 가지고 코드를 작성한다.→ return null을 자제한다. NPE 발생 여지를 만든다.→ 대안책으로 Optional이 있다. Optional에 대하여→ Optional은 비싼 객체다. 꼭 필요한 상황에서만 반환 타입으로만 사용한다. 반환 타입이 아닌 파라미터로 받지 말자.→ Optional은 분기 케이스가 존재한다.Optional 자체가 null인지Optional에 담긴 데이터가 null인지따라서 파라미터로 Optional을 받아서는 안 된다.. [Spring] Lombok에서 @Data와 @AllArgsConstructor는 지양하자. @Data 애너테이션포함하는 애너테이션 : @Getter, @Setter, @RequireArgsConstructor, @ToString, @EqualsAndHashCode/** * @see Getter * @see Setter * @see RequiredArgsConstructor * @see ToString * @see EqualsAndHashCode*/@Target({ElementType.TYPE})@Retention(RetentionPolicy.SOURCE)public @interface Data { String staticConstructor() default "";} @Data 애너테이션이 포함하는 애너테이션들에 대해서 알아보자. @Setter는 수정하면 안 되는 값을 수정하게 만든다.E.. 테스트가 어려운 영역을 분리하기 테스트가 어려운 코드 영역 구분주문 메서드 작성키오스크 주문은 10시 ~ 22시 사이로 가능하다. 그 시간 외에는 IllegalArgumentException 예외가 발생한다.@Getterpublic class CafeKiosk { public static final LocalTime SHOP_OPEN_TIME = LocalTime.of(10, 0); public static final LocalTime SHOP_CLOSE_TIME = LocalTime.of(22, 0); private final List beverages = new ArrayList(); public Order createOrder() { LocalDateTime currentDateTime = Loc.. [Spring] @Value는 static 변수에 사용할 수 없다. 문제 시나리오CorsConfig 클래스에 작성된 domain 필드가 존재한다.@Value 애너테이션을 사용하여 application.yml에 작성한 값을 domain 필드에 주입한다.application.yml... 생략server: domain: ${SERVER_DOMAIN}CorsConfig@Configurationpublic class CorsConfig { @Value("${server.domain}") static String domain; public static CorsConfigurationSource corsConfiguration() { CorsConfiguration configuration = new CorsConfiguration(); .. [Spring] Redis를 사용하여 조회 성능 개선하기 1. 회고 카드(Section)와 회고 보드(Retrospective)우리 프로젝트는 1개의 회고 보드에 여러 개의 회고 카드를 작성할 수 있다. 즉, 회고 보드와 회고 카드는 1:N 관계이다. 따라서 회고 보드를 조회하면 작성된 모든 회고 카드를 조회할 수 있다. 2. 새로운 회고 카드(Section) 생성하기우리 프로젝트는 회고 보드(retrospective)에 작성된 모든 회고 카드(section)를 DB에서 조회한다. GET /sections를 호출하여 모든 회고 카드를 조회하는 것을 확인할 수 있다. 새로운 회고 카드를 등록하면 POST /sections 요청을 통해 DB에 새로운 회고 카드를 등록한다. 생성된 회고 카드를 포함하는 모든 회고 카드를 가져오기 위해서 다시 GET /section.. [Spring-Security] Swagger에서 GET을 제외한 모든 HTTP 메서드에서 발생하는 CORS 문제 해결하기 1. 사건의 발달도메인을 구매하기 전에는 AWS EC2의 IP를 사용하여 Swagger를 배포하였다. Swagger를 통해 서버로 요청을 보내게 되면, Swagger 주소와 서버 주소가 동일하기 때문에 CORS 문제를 고민할 필요가 없었다. 이젠 도메인을 구매하고 SSL 인증서를 발급받아 도메인 주소로 Swagger를 접속하도록 하였다. 그런데 GET 요청을 제외한 나머지 HTTP 메서드에 대해서 전부다 403 Invalid CORS request 오류가 발생하였다. 도메인에 맞춰서 Cors와 Swagger 설정을 했음에도 해결되지 않았다. 하루 내내 붙잡고 있어도 해결되지 않아, 게임으로 잠시 도피하고…. 다음날 처음부터 차근차근 해보니 해결책을 찾았다. 동일한 개발 환경에서 이 오류가 발생하는 사람이.. 이전 1 2 3 다음