묻고 답해요
133만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
성능 측정 관련 강의가 있나요?
안녕하세요. 성능 최적화 관련 학습을 하고 있습니다.혹시 성능 측정, 모니터링 방법에 관련한 설명 부분이나 강의가 있을까요? 강의 작업들을 수행함으로 인해 얼마나 처리시간이 단축되는지 확인을 해보고싶은데 그런 부분은 개인적으로 따로 학습을 해야하는지, 아니면 잘 정리된 수업이 있는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA와 DB 설정, 동작확인 질문있습니다.
강의 10분 39초에 custom이 없어요.알파벳 순으로 나오는것 같은데 a뒤에 c로 시작하는게 없어요.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
다대다 관계를 중간테이블을 생성하였을 때 중간 테이블을 사용하는 방법이 궁금합니다.
만약에 주문이라는 내용이 실제로 많이 필요하지 않고 서로 구매 여부만 판단하고 싶을 때 제가 생각했을 때 Member과 Item 사이의 중간 테이블만 만들어서 외래키로만 조회를 하면서 구매 여부를 판단해도 되지 않을 까 싶은데 그러면 문제점이 무엇인지도 알고 싶습니다.마지막으로는 중간 테이블에는 @ManyToOne을 수업에서 제공하신대로 작성해였는데, Member입장에서 중간 테이블을 조회하게 되면 DB가 뻥튀기 되기도 하고, member 테이블에서 굳이 item 어떤 것을 샀는지나 주문이 어떤것인지를 더하면 뭔가 멤버라는 엔티티의 기본 속성들을 회손하는것 같아서 @OneToMany를 제거하려고 하는데 2개의 일대다 에서 모두 제거해도 괜찮은지 여쭙고 싶습니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
인수 테스트에 대한 비중은 어느정도로 가져가는게 좋다고 생각하시나요?
안녕하세요 강사님.!좋은 강의 잘 들었습니다.!덕분에 좋은 자산을 남겨 놓을 수 있을 거 같습니다. 이번 강의에서 인수 테스트에 관한 내용은 없어서 인수 테스트에 관한 강사님의 전반적인 견해가 궁금합니다. 1)다른 단위/통합 테스트에 비해서 인수 테스트에 대한 중요도가 낮다고 생각하시나요? 2)현업에서 인수 테스트에 대한 비중은 어느 정도로 가지고 가시나요? 개인적으로는 가장 사용자 친화적인(?) 인수테스트도 중요하다고 생각하고 있습니다. 감사합니다.! 좋은 하루 되세요!
-
미해결실전! 스프링 데이터 JPA
강의 수강 중 질문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의 내용을 듣고 제가 따로 프로젝트를 만들어서 비교를 해 보았는데@Entity @DynamicInsert @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User { @Id private String id; // 이메일 형식 @Column(nullable = false) private String password; @Column(nullable = false) private String name; @Column(nullable = false, unique = true) private String nickname; @Column(nullable = false, unique = true) private String phone; @CreationTimestamp @Column(nullable = false) private LocalDateTime createAt; @Enumerated(EnumType.STRING) @ColumnDefault("'NORMAL'") private UserStatus status; // 이미지 변수 (프로필 사진) public User(String id, String password, String name, String nickname, String phone) { this.id = id; this.password = password; this.name = name; this.nickname = nickname; this.phone = phone; } }@Test public void basicCRUD() { User user1 = new User("user1","123","kk","sssss","123213213"); User user2 = new User("user2","1321","dd","dddd","21312412412421"); userRepository.save(user1); userRepository.save(user2); //단건 조회 검증 User findUser1 = userRepository.findById(user1.getId()).get(); User findUser2 = userRepository.findById(user2.getId()).get(); assertThat(findUser1).isEqualTo(user1); assertThat(findUser2).isEqualTo(user2);테스트를 실행 시켜보니Expected :com.clickpick.domain.User@51577fc8Actual :com.clickpick.domain.User@4dbeae45 오류가 발생하였습니다.강사님의 강의를 따라했을 땐 동일하다고 하였는데 저의 예시로 해보니 동일하지 않다고 나오는데 어느부분에서 차이점이 생긴지 알고싶습니다 참고로 repository는public interface UserRepository extends JpaRepository<User, String> { } 입니다.
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
application.yml 포트번호
spring: datasource: url: "jdbc:mysql://localhost:3307/library" username: "root" password: "kimdh991234@" driver-class-name: com.mysql.cj.jdbc.Drivermysql을 설치할때 3306포트가 사용중이어서 설치가안되어서 3307로 포트를 설정하고 설치했더니 기존코드에서는 에러가 발생했습니다 그래서 포트번호를 달아줬더니 에러없이 동작하는데 3306포트로 동작하게 되면 생략이 가능한건가요?mysql 기본 포트세팅이 3306이어서 그런걸까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
AbstractGatewayFilterFactory 적용 문제
현재 spring 3.2 버전에서 강의를 따라가고 있습니다. AbstractGatewayFilterFactory를 찾지 못하는 것 같습니다. 혹시 해결방법이 있을까요
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
깃허브 주소를 못 찾겠어요
스프 2탄 깃허브 주소좀 부탁드립니다 ~
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team.getMembers에 관한 질문
em.flush() em.clear를 해야지만 findTeam.getMembers()를 통해서 members조회가 가능하더라구요. 제가 이해한 바로는 Team안에@OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();이렇게 되어있지만 우리가 members에 대해서 설정한 부분이 없다. 여기까지는 이해했습니다. 그렇다면 이렇게 설정하고 DB에 flush를 하면 JPA가 알아서 Team에 대한 members를 넣어주는건가요? 아니면 em.find(Member.class,member.getId())를 했을 때에 JPA가 members를 찾아주나요? 이것이 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
인텔리제 프로젝트 삭제와 프로젝트 실행 오류
5강을 듣다가 제 화면과 강사 선생님과 화면이 달라서 프로젝트를 삭제 했습니다. 그런 뒤 다시 프로젝트를 오픈했는데 저런 화면이 뜨면서 실행되지 않고 오류가 생깁니다.프로젝트를 삭제하고 캐쉬도 삭제 하고, 심지어 인텔리제이도 삭제해봤는데 여전히 저런 화면이 뜹니다. 어떻게 해야되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링 서버를 모바일에 띄울 수 있나요?
안녕하세요 이번에 강의를 완강하고 스프링을 이용한 프로젝트를 해보려고합니다.해보고 싶은 건 잠금화면 단어장 앱입니다.휴대폰을 키면 나오는 잠금화면에 단어장에서 랜덤한 단어가 나와서 단어를 복습할 수 있고제가 단어를 직접 등록할 수도 있고, 검색할 수도 있도록 만들고 싶습니다.제가 생각하기로는 스프링 웹 서버를 휴대폰에 띄우고, DB도 휴대폰 내부 메모리에 띄우도록 작업하려고 하는데. 이게 가능한 것인지 궁금합니다.또한 안드로이드 스튜디오를 써서 개발할 생각인데 안드로이드 스튜디오로 스프링 프로젝트를 생성하는 것부터 어떻게 해야할지 감이 잘 오지 않습니다. 제가 정말 개발초보라 질문이 두서 없지만 어떻게 해야할지 조언 부탁드립니다. 참고할만한 자료도 있으면 부탁드리겠습니다..!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 데이터테이블이 안만들어져요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]https://drive.google.com/file/d/1h-MGfbVOOqUMAtIrqo7Ys52FE4UnV9Am/view?usp=drive_linkMemberRepository를 실행했을 때 오류가 떠요어쩔 수 없이 뒷강의를 듣다가 앞으로 넘어오게 돼서 Order나 Item, Delivery 클래스들이 만들어져 있는데 이것들 때문일까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
프록시 초기화 안했는데 조회되는 경우가 있나요?
@GetMapping("/api/v2/orders") public List<OrderDto> ordersV2() { List<Order> orders = orderRepository.findAllByString(new OrderSearch()); return orders.stream() .map(order -> new OrderDto(order)) .collect(Collectors.toList()); } @Getter static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private Address address; private List<OrderItem> orderItems; public OrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); address = order.getDelivery().getAddress(); orderItems = order.getOrderItems(); } }안녕하세요!강의 잘 듣고 있습니다~제가 OrderDto 안에 있는데 orderItem을 초기화 하지 않았는데, null로 반환되지 않고 db에 있는 값으로 반환이 되어서요..! (jpa 활용2편 강의 섹션 4에선 null로 찍힙니다)혹시 프록시는 초기화하지 않아도 그대로 값이 응답에 반영되는건가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
/actuator/metrics 에서 names 값에 대한 질문
스프링 부트 버전 : 3.2.2JDK : 17 spring cloud gateway 를 사용하여127.0.0.1:8000/user-service/welcome, 127.0.0.1:8000/user-service/heath_check 주소를 호출했습니다.http://127.0.0.1:8000/user-service/actuator/prometheus 를 호출결과 중 일부입니다.# HELP http_server_requests_seconds # TYPE http_server_requests_seconds summary http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/heath_check",} 5.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/heath_check",} 0.020372399 http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 1.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.8039679 http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/health",} 1.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/health",} 0.0116107 http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/welcome",} 3.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/welcome",} 3.827017999 http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 8.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 0.039744298 http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="CLIENT_ERROR",status="404",uri="/**",} 1.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="CLIENT_ERROR",status="404",uri="/**",} 0.014729801 http_server_requests_seconds_count{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/info",} 1.0 http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/info",} 0.090424499 # HELP http_server_requests_seconds_max # TYPE http_server_requests_seconds_max gauge http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/heath_check",} 0.003873199 http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.8039679 http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/health",} 0.0 http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/welcome",} 0.0 http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/metrics",} 0.0 http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="CLIENT_ERROR",status="404",uri="/**",} 0.0 http_server_requests_seconds_max{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/actuator/info",} 0.0http://localhost:8000/user-service/actuator/metrics 를 호출결과 names 배열값에강의화면과 다르게 users.welcome, users.status 값이 없습니다. pom.xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> <version>2.2.8.RELEASE</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> application.ymlmanagement: endpoints: web: exposure: include: refresh, health, beans, busrefresh, info, metrics, prometheus tracing: sampling: probability: 1.0 propagation: consume: b3 produce: b3 zipkin: tracing: endpoint: "http://localhost:9411/api/v2/spans" controller.javapackage com.example.userservice.controller; import com.example.userservice.dto.UserDto; import com.example.userservice.jpa.UserEntity; import com.example.userservice.service.UserService; import com.example.userservice.vo.Greeting; import com.example.userservice.vo.RequestUser; import com.example.userservice.vo.ResponseUser; import io.micrometer.core.annotation.Timed; import org.modelmapper.ModelMapper; import org.modelmapper.convention.MatchingStrategies; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @RestController public class UserController { private Environment env; private UserService userService; @Autowired private Greeting greeting; public UserController(Environment env, UserService userService) { this.env = env; this.userService = userService; } @GetMapping("/heath_check") @Timed(value = "users.status", longTask = true) public String status() { return String.format("It's Working in User Service " + ", port(local.server.port)=" + env.getProperty("local.server.port") + ", port(server.port)=" + env.getProperty("server.port") + ", port(token.secret)=" + env.getProperty("token.secret") + ", port(token.expiration_time)=" + env.getProperty("token.expiration_time") ); } @GetMapping("/welcome") @Timed(value = "users.welcome", longTask = true) public String welcome() { // return env.getProperty("greeting.message"); return greeting.getMessage(); } @PostMapping("/users") public ResponseEntity<ResponseUser> createUser(@RequestBody RequestUser user) { ModelMapper mapper = new ModelMapper(); mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); UserDto userDto = mapper.map(user, UserDto.class); userService.createUser(userDto); ResponseUser responseUser = mapper.map(userDto, ResponseUser.class); return ResponseEntity.status(HttpStatus.CREATED).body(responseUser); } @GetMapping("/users") public ResponseEntity<List<ResponseUser>> getUsers() { Iterable<UserEntity> userList = userService.getUserByAll(); List<ResponseUser> result = new ArrayList<>(); userList.forEach(v -> { result.add(new ModelMapper().map(v, ResponseUser.class)); }); return ResponseEntity.status(HttpStatus.OK).body(result); } @GetMapping("/users/{userId}") public ResponseEntity<ResponseUser> getUser(@PathVariable String userId) { UserDto userDto = userService.getUserById(userId); ResponseUser returnValue = new ModelMapper().map(userDto, ResponseUser.class); return ResponseEntity.status(HttpStatus.OK).body(returnValue); } }
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
simplejdbcinsert
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]simplejdbcinsert를 여러 테이블에 적용해야 한다면 적용할 테이블 개수에 맞춰서 객체를 생성해줘야 할까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
RabbitMq 에 대해
현재 강의에서 RabbitMq를 사용하여 어떻게 각각의 서버로 변경된 데이터를 전달하는지 아키텍처가 궁금합니다. 각각의 서버는 RabbitMq서버를 구독하고있는건가요?푸시방식이라고 했는데 각각의 서버가 RabbitMq의 큐에서 메시지를 가져가는 폴링방식이 아닌가요?구독하고있는 각 서버로 브로드캐스트하여 푸시하는 방식이지 폴링방식이 아니라는건가요?busrefresh를 통하여 큐에 메시지를 발행하고, 각 서버는 큐에서 메시지를 꺼내어가져가는건가요(폴링)? 아니면 큐에서 메시지를 RabbitMq가 직접 각각의 서버로 전송하는 푸시방식인가요? 푸시방식이 맞다면 AMQP프로토콜로 서버들이 실행할때마다 이미 연결이 되어있는 상태를 유지하고 있기 때문에 푸시가 가능한건가요?원리가 궁금합니다..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
allocationSize 질문
IDENTITY전략에서 allocationSize가 50개로 설정하면 50개를 가져와 메모리에서 쓴다고 하셨는데 제대로 이해를 하지 못한것 같습니다. DB에서 1부터 51까지 미리 늘려놓고? 51까지의 메모리..? 어떤 값을 가져와서 em.persist 할때마다 뭐 큐나 스택처럼 하나씩 빼면서 pk값을 넣는건지 궁금하네요. 또 메모리에서 쓴다는게 어떤건지 잘 모르겠습니다. DB에서 꺼내서 쓰는게 아닌것 까지는 이해했지만 메모리에서 쓴다..?를 잘 모르겠습니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
트랜잭션 커밋 질문
섹션3 플러시 부분을 듣다가 궁금증이 생겨 질문을 남깁니다.3분에 말씀하신 내용에 따르면 try{ Member member = new Member(200L,"member200"); em.persist(member); em.flush(); //영속 System.out.println("===================="); tx.commit(); } catch (Exception e){ tx.rollback(); }finally { em.close(); } emf.close();em.flush()를 하면 데이터베이스에 쿼리가 나가고 tx.commit()을 통해 트랜잭션 커밋이 된다고 하셨는데 트랜잭션 커밋을 언제 사용하는지?가 궁금합니다. 그냥 플러시를 하기 위해서 쓰이는 것인지 아니면 try catch문으로 되어있어서 try문에서 제대로 동작을 한다면 마지막에 DB에 잘 적용되었다는 느낌으로 commit을 하는것이 맞나요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의 내용을 따라가던 도중에 의문이 생겨서 질문드립니다.
안녕하세요. 태현님, 좋은 강의 감사합니다. 오늘 BookService 코드를 같이 타이핑하던 도중 의문이 생겼습니다. 뭔가 점점 BookService에서 의존을 주입받는 레포지토리가 점점 늘어나고 있음이 그 원인이었는데요. 보통 커머스 서비스의 앱에서 주문 상세 버튼을 누르면 다음과 같은 정보들이 나오는데요.가게 정보메뉴 정보,주문 자체의 정보(주문 일시, 주문번호)메뉴와 옵션 선택 정보쿠폰 적용 주문자의 개인정보(주소 및 연락처)등등.. 물론 내부적으론 어떻게 해결이 되어있겠지만 벌써 주문 상세를 보여주는 기능을 처리하기 위한 서비스에서 엄~청 많은 레포지토리를 가져와야할 것 같은? 느낌이 듭니다. 이런 경우엔 의존 주입을 받는 객체의 갯수의 상한선을 따로 두고 개발하실까요?아니면 이런 문제를 해결하는 방법론 같은 것이 이미 있나요?혹은 제 생각엔 짤막하게 배운 디비 지식으로 주문과 같은 것은 반정규화로 테이블을 합쳐서 그 테이블과 대응되는 하나의 레포지토리로만 가져오나요?감사합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
이미지 조회 404
리액트로 이미지를 조회하려는데 자꾸 404 Not Found가 반환되요.포스트맨으로 동일한 조건으로 요청을 하면 제대로 이미지가 반환이 되네요. async function getIamge(filename){ await axios.get(`http://localhost:8080/imageFiles/${filename}`) .then((action)=>{ let data = action.data; let copy = [...images,data]; setImages(copy); }) .catch((error)=>{ console.log('서버 응답 코드:', error.response.status); console.log('서버 응답 데이터:', error.response.data); console.log('서버 응답 헤더:', error.response.headers); }) }이런식으로 요청을 했습니다. img태그로 직접 엔드포인트로 요청을 보냈을 때도 똑같은 상황입니다. @GetMapping("/imageFiles/{filename}") @CrossOrigin(origins = "*") public ResponseEntity<Resource> downloadExecute(@PathVariable("filename") String filename) throws IOException { log.info("Full Path = {}", fileDir + filename); String str = URLEncoder.encode(filename, "UTF-8"); Path path = Paths.get(fileDir + filename); Resource resource = new InputStreamResource(java.nio.file.Files.newInputStream(path)); System.out.println("resource : "+ resource.getFilename()); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_TYPE, "application/octect-stream") .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename="+str+";") .body(resource); }이미지를 보내주는 서버측 엔드포인트입니다. @Configuration public class CorsMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //.allowedOrigins("http://localhost:3000") .allowedOrigins("*") .allowedMethods( HttpMethod.GET.name(), HttpMethod.POST.name(), HttpMethod.HEAD.name(), HttpMethod.PUT.name(), HttpMethod.DELETE.name() ); registry.addMapping("/imageFiles/**") .allowedOrigins("*") .allowedMethods( HttpMethod.GET.name(), HttpMethod.POST.name(), HttpMethod.HEAD.name(), HttpMethod.PUT.name(), HttpMethod.DELETE.name() ); } } cors설정도 해봤는데 결과는 똑같았습니다. 뭐가 문제일까요 ㅠ