묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
예외테스트 중 저번강의에서 햇던 것과 차이
Exception을 테스트하는 부분에서 궁금한 점입니다. 해당 강의에서는 @Test(expected = IllegalStateException.class) 어노테이션과fail()함수를 이용해서 테스트하셨는데, 이 강의보다 최신강의로 알고있는 spring 기본편에서 테스트하실때는 아래코드와 같이 하셨습니다.두 테스트 차이가 있을까요? @Test public void 회원가입_중복() throws Exception { // given Member member1 = new Member(); member1.setName("인프런"); Member member2 = new Member(); member2.setName("인프런"); // when memberService.join(member1); // then IllegalStateException e = assertThrows(IllegalStateException.class, () -> { memberService.join(member2); }); assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
service와 controller의 역할에 대한 질문이 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]service와 controller의 역할에 대한 질문이 있습니다. 강의를 듣고 활용해던 도중 의문점이 생겼습니다. 한참 찾아봤는데 아직도 모르겠어서 질문드립니다. 저의 기존 코드에서는 어떤 컨트롤러의 post 요청에서 A,B,C 엔티티가 반드시 순서대로 생성된후 저장되어야 합니다. (참조관계 떄문에 그렇습니다) 기존에 저는 컨트롤러에서 A 엔티티 생성 -> AService.createA() 한 후 B, C도 동일한 과정을 거칩니다. 이러니까 컨트롤러가 서비스의 역할을 해버린다고 생각했습니다. 그래서 컨트롤러는 그냥 dto를 넘겨주고 서비스에서 위의 작업을 하려했습니다. 그랬더니 몇가지 문제가 생겼습니다. 1. service에서 repository만을 사용하면 코드 중복이 심함(create 할때 복잡한 중복검증 로직이 있는대, 그것까지 전부 다시 해야함) 2. service에서 service를 주입받아서 하자니 순환참조, 나말고 코드 이해도 낮은 다른사람이 손대면 실수할 가능성 높음 등등의 문제가 생김 그래서 그냥 원래대로 냅두려니 controller가 너무 크고 service가 하는게 그냥 repository로 요청 보내기인 경우가 대부분임 그래서 질문은 1. 적절한 방법이 뭘까요? 2. 복잡하고 큰 규모의 서버 코드를 보고싶은데 좋은 예시를 어디서 찾을수 있을까요? 3. 제가 해결방법으로 여러 service를 주입받아서 사용만하는 service를 만들어서 컨트롤러에 있던 코드를 거기로 옮겨서 컨트롤러에 비즈니스 로직이 생기는걸 없에고 순환참조, 코드 중복 등을 제거 해봤는데 이게 맞는건가요? 4. MSA와 상관있는 문제일까요?
-
미해결실전! 스프링 데이터 JPA
save 질문드립니다.
jpa 커리큘럼 듣고있는 학생입니다. 첫 커리큘럼 강의 merge를 쓰지말라고 하셨는데(*1), 스프링 데이터 jpa의 save를 보면(SimpleJpaRepository구현체) merge를 사용하고 있습니다. 그러면 실무에서 스프링 데이터 jpa를 사용할 때 save기능을 사용하여야 하는것인지 사용하지 말아야 하는것인지 가이드 라인이 있을까요? *1.DB에서 데이터를 가지고 오기때문에 sql이 한번 나가는 문제, DB에서 가지고 온 데이터 수정할 때 일정 필드값이 누락될 경우 누락된 값은 변경감지와는 달리 없어지기 때문 등등의 문제로
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade 사용 이점
Order 엔티티의 orderItem과 delivery에 cascade를 사용했기 때문에 둘의 레포지토리를 만들지 않은 건지 궁금합니다. 만약, cascade를 사용하지 않았다면 레포지토리를 만들어줘야 하는 건가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
정적 팩토리 메소드로 변경감지
@Controller @PostMapping("/items/{itemId}/edit")public String update(@PathVariable("itemId")Long itemId, @ModelAttribute("form") BookForm form){ itemService.updateItem(itemId, form.getName(), form.getPrice(), form.getStockQuantity(), form.getAuthor(), form.getIsbn()); return "redirect:/items";} @Service /** * 다운캐스팅 없이 따로 findBook 메소드를 만들어줌 */@Transactionalpublic void updateItem(Long id, String name, int price, int stockQuantity, String author, String isbn) { Book findBook = itemRepository.findBook(id); findBook.updateBook(name, price, stockQuantity, author, isbn); log.info("update실행");} Book엔티티 @Entity@DiscriminatorValue("B")@Getter@NoArgsConstructor(access = AccessLevel.PRIVATE)@Slf4jpublic class Book extends Item { private String author; private String isbn; private Book(String name, int price, int stockQuantity, String author, String isbn) { super(name, price, stockQuantity); this.author = author; this.isbn = isbn; } /** * 정적 팩토리 메소드 생성 */ public static Book createItem(String name, int price, int stockQuantity, String author, String isbn) { Book book = new Book(name, price, stockQuantity, author, isbn); return book; } /** * update 변경 로직 */ public void updateBook(String name, int price, int stockQuantity, String author, String isbn) { addItem(name, price, stockQuantity); this.author = author; this.isbn = isbn; }} Item엔티티 /** * update 변경 로직 */protected void addItem(String name, int price, int stockQuantity) { this.name = name; this.price = price; this.stockQuantity = stockQuantity;} 안녕하세요! 2회독하면서 영한센세가 말씀하신대로 setter는 최대한 쓰지않고 개발하고있습니다. 따로 DTO는 만들지않고 정적 팩토리 메소드를 활용해서 변경감지 로직을 짜봤는데 제대로 짠건지 잘 모르겠네요. 여기서 더 수정 하자면 어떤부분을 고치면 좋을까요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성 메서드란게 정적 팩토리 메서드를 말하는건가요??
정적 팩토리 메서드와 코드가 엄청 유사한데 객체 생성을 위한 메서드로 이해하면 될까요??
-
미해결스프링 시큐리티
CustomAuthenticationProvider 질문입니다.
안녕하세요. 이번 강의를 들으면서 질문하고자 하는 내용은 바로 앞 강의 CustomUserDetailsService 구현만으로 로그인이 정상적으로 되는지 안 되는지 체크를 해 주었는데, 이번 강의에서는 CustomAuthenticationProvider 를 사용해서 입력 비밀번호와 디비 저장 비번을 matches 로 비교를 직접하셨는데요. 기능적으로 두 강의의 차이를 모르겠어요. 그럼 실제 사이트에서 로그인 로직을 만들때는 CustomUserDetailsService, CustomAuthenticationProvider 모두를 구현해 줘야 하는건가요? 감사합니다. ^.^
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
setter
[질문 내용]BookForm을 setter로 계속 값 넣어주신 부분에서 set, set, set.. 이게 너무 귀찮아서 구글링 해보니까 @Builder 어노테이션을 Lombok에서 지원하던데 BookForm 엔티티에 이거 사용해도 문제 없나요? Book item = (Book) itemService.findOne(itemId);BookForm form = new BookForm.BookFormBuilder() .id(item.getId()) .author(item.getAuthor()) .isbn(item.getIsbn()) .name(item.getName()) .price(item.getPrice()) .stockQuantity(item.getStockQuantity()) .build();
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
어플리케이션 계층이 예제에 있는 것인지 궁금합니다.
안녕하세요. 도메인 주도 모델을 공부하면서 강의를 복습하고 있습니다. 비즈니스 로직이 Entity 객체에 들어가는 이유 등은 조금씩 이해가 가고 있는 중입니다. 그런데 제가 경험이 없다보니 이론서와 예제를 비교하다 보니까 다른 점이 몇 가지 있어서 실제로는 반드시 이론대로 사용하는 것은 아닌가? 라는 생각도 들고 학습을 위해서 간단히 만드신 건가 잘 모르겠어서 질문드려봅니다. 도메인 주도 설계 아키텍쳐를 보면 1 프레젠테이션 계층 2 애플리케이션 계층3 도메인 계층4 인프라스트럭처 계층 이렇게 나누어진다고 하는데요. 여기서 1 프레젠테이션 계층이 MVC이고 영상에서 나오는 controller domain service는 3 도메인 계층으로 보입니다. 그런데 2 애플리케이션 계층은 보이지 않고 애플리케이션 계층이 와야 할 자리에 도메인 계층이 있는 것처럼 보입니다. 예를 들면 도메인 객체인 Entity나 Repository가 Controller에서 사용되고 있습니다. 이론서를 보면 컨트롤러에서는 도메인 계층의 구현을 알지 않는 것이 좋으며, 모든 도메인 계층에 대한 호출은 어플리케이션 계층 안에서(ex entityApplicationService Class 안에서) 이루어지는게 좋다고 하더라고요. 실무에서도 예제처럼 어플리케이션 계층을 생략하고 할 때가 많나요? 아니면 강의에서는 학습용으로 생략이 된 것인지 제가 무언가 간과하고 있는 부분이 있는지 궁금해서 이렇게 질문드리게 되었습니다.
-
미해결Spring Boot JWT Tutorial
AuthController에서 loadByUsername 메서드 실행 경로
authenticationManagerBuilder.getObject().authenticate(authenticationToken);이 실행되면 loadUserByUsername으로 어떻게 넘어가지는지 이해가 되지 않습니다. loadUserByUsername은 customUserDatailSevice의 메서드인데 어째서 authenticationdml authentiacate메서드를 실행하면 CustomUserDatailService의 메서드가 호충되는 건가요?
-
미해결스프링 배치
docker db (mysql) 이 죽는 현상이 있습니다.
안녕하세요. 좋은 강의 만들어주셔서 감사합니다. 아래와 같이 강좌와 유사하게 spring.datasource.hikari 로 mysql 설정을 한 후 간단한 job 을 실행시키면 docker 로 설치한 mysql db 가 죽는 현상이 있습니다. 혹시 hikari 설정이 부족해서 그런 것일까요? 강좌에서는 잘 진행이 되는것 같아서 질문드립니다. 그래서 주석 처리하고 기존에 하던 방식으로 spring.datasource 를 이용해서 mysql 설정을 했습니다. spring.datasoruce 는 datasource 설정인거 같고, spring.datasource.hikari 는 hikari connection pool 설정인거 같은데요. 헷갈리네요. 어디에 db 설정을 정의하는것이 기본일까요? spring: profiles: active: local---spring: config: activate: on-profile: local datasource:# hikari:# jdbc-url: jdbc:mysql://av-api01-dc.nfra.io:23306/aida_project?useUnicode=true&characterEncoding=utf8# username: root# password: root# driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver batch: jdbc: initialize-schema: always
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
필터링 대신에 dto를 사용하면 안되나요?
예를들면 UserSimpleDto 클래스로 id, name, joinDate만 내려주고 전체 데이터는 User에서 가져오는 방식은 문제가 있을까요? 제가 rest api를 처음 제대로 접해봐서 뜬금없는 질문인것 같긴한데 궁금해서 질문드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 자동 생성이 안됩니
예전에 jpa 활용을 듣고 진행했을 때는 실행 시 h2에 엔티티들이 잘 들어갔고 그 때 작성했던 jpashop은 여전히 잘 동작하는데 이번에 다시 새로운 프로젝트를 만들고 똑같은 설정으로 다시 하는데 h2에 테이블이 자동생성되지 않습니다 이유를 잘 모르겠습니다ㅠㅠ 전에 했던 다른 프로젝트로 db 파일에 접근하는건 잘 되는데 이 프로젝트에서만 안되는걸보니 이 프로젝트에서 뭔가 잘못된게 있는것 같습니다 application.yml spring: datasource: url: jdbc:h2:tcp://localhost/~/sss username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: true logging.level: org.hibernate.SQL: debug Member 엔티티 package com.sss.domain; import lombok.Data; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @Data public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; } "C:\Program Files\Java\jdk-11.0.11\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar=52190:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\bin" -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath C:\springProjects\subscriptionsharing\out\production\classes;C:\springProjects\subscriptionsharing\out\production\resources;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.projectlombok\lombok\1.18.22\9c08ea24c6eb714e2d6170e8122c069a0ba9aacf\lombok-1.18.22.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-data-jpa\2.5.6\8d7fe99c33e09390316749614d9795d80b49207b\spring-boot-starter-data-jpa-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-validation\2.5.6\89f34956247743c97e16fa0dd7176743fc8dea08\spring-boot-starter-validation-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-web\2.5.6\46b479490170914f7477b96a21241183b181c24d\spring-boot-starter-web-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-aop\2.5.6\c5db1260ecf447f55419f1a17da75a42f211aca3\spring-boot-starter-aop-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-jdbc\2.5.6\cf01e787378c2d30b695f0c9f76fb48a6b490984\spring-boot-starter-jdbc-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\jakarta.transaction\jakarta.transaction-api\1.3.3\c4179d48720a1e87202115fbed6089bdc4195405\jakarta.transaction-api-1.3.3.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\jakarta.persistence\jakarta.persistence-api\2.2.3\8f6ea5daedc614f07a3654a455660145286f024e\jakarta.persistence-api-2.2.3.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.hibernate\hibernate-core\5.4.32.Final\99a5e10bf455337014c190e141ec631e9ff71663\hibernate-core-5.4.32.Final.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.data\spring-data-jpa\2.5.6\8e0ec2f54f3fcda49dfb3123f3a40f34b55df92a\spring-data-jpa-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aspects\5.3.12\3cccc3052c6973c059eb2be7c4baf0b9558d49b7\spring-aspects-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter\2.5.6\d5d1fada1afe9a808abf48da7066a993cf679aa\spring-boot-starter-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-el\9.0.54\9edb062d38d0fd8a165289f44b28b3b0e0e11ed7\tomcat-embed-el-9.0.54.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.hibernate.validator\hibernate-validator\6.2.0.Final\d6b0760dfffbf379cedd02f715ff4c9a2e215921\hibernate-validator-6.2.0.Final.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-json\2.5.6\6ef5a7087e18ed4f3736c8752440ecd489c36a4d\spring-boot-starter-json-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-tomcat\2.5.6\6d1a04a727d9d09b99207864ceb0a4567e53730a\spring-boot-starter-tomcat-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-webmvc\5.3.12\3d92ad6c28bfa5923183f328f5bfa1e39ec32714\spring-webmvc-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-web\5.3.12\78991a50d17da49bddc4987a2cc8b83d46c402a7\spring-web-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aop\5.3.12\882db41939109e96f4c78cd5c0931cc4aebc3d58\spring-aop-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.aspectj\aspectjweaver\1.9.7\158f5c255cd3e4408e795b79f7c3fbae9b53b7ca\aspectjweaver-1.9.7.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.zaxxer\HikariCP\4.0.3\107cbdf0db6780a065f895ae9d8fbf3bb0e1c21f\HikariCP-4.0.3.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jdbc\5.3.12\957d6ddc80fbf52d965e6af90ddd0dccfed42d7d\spring-jdbc-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.hibernate.common\hibernate-commons-annotations\5.1.2.Final\e59ffdbc6ad09eeb33507b39ffcf287679a498c8\hibernate-commons-annotations-5.1.2.Final.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.jboss.logging\jboss-logging\3.4.2.Final\e517b8a93dd9962ed5481345e4d262fdd47c4217\jboss-logging-3.4.2.Final.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.javassist\javassist\3.27.0-GA\f63e6aa899e15eca8fdaa402a79af4c417252213\javassist-3.27.0-GA.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy\1.10.22\ef45d7e2cd1c600d279704f492ed5ce2ceb6cdb5\byte-buddy-1.10.22.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\antlr\antlr\2.7.7\83cd2cd674a217ade95a4bb83a8a14f351f48bd0\antlr-2.7.7.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.jboss\jandex\2.2.3.Final\d3865101f0666b63586683bd811d754517f331ab\jandex-2.2.3.Final.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml\classmate\1.5.1\3fe0bed568c62df5e89f4f174c101eab25345b6c\classmate-1.5.1.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.dom4j\dom4j\2.1.3\a75914155a9f5808963170ec20653668a2ffd2fd\dom4j-2.1.3.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.glassfish.jaxb\jaxb-runtime\2.3.5\a169a961a2bb9ac69517ec1005e451becf5cdfab\jaxb-runtime-2.3.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-context\5.3.12\d5f5f044e05109b7f3337ea2cf692fd62d1ecbb6\spring-context-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-orm\5.3.12\2881f9e71889b35fa3785bf67706a201cea93004\spring-orm-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.data\spring-data-commons\2.5.6\15a2384f4eaf7fee512fb295174f6c0fb6c55ee1\spring-data-commons-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-tx\5.3.12\7f2e61a22682baa22ed5bef0724a4386c41477cb\spring-tx-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-beans\5.3.12\caaa1d489bce88d6aa01ddd255ad5046acf8f282\spring-beans-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-core\5.3.12\662e6536968246af9baa84fbac2d3eb56a04fda9\spring-core-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\1.7.32\cdcff33940d9f2de763bc41ea05a0be5941176c3\slf4j-api-1.7.32.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-autoconfigure\2.5.6\b9f4016180c5242530da465561ff25c7cac14bf3\spring-boot-autoconfigure-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot\2.5.6\d8c6b97fd3182fb6d7d06ebf710cd9ccabc83b89\spring-boot-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-logging\2.5.6\a900356a11b1a41f4277136f1d13ce7a13f43b3c\spring-boot-starter-logging-2.5.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\jakarta.annotation\jakarta.annotation-api\1.3.5\59eb84ee0d616332ff44aba065f3888cf002cd2d\jakarta.annotation-api-1.3.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.yaml\snakeyaml\1.28\7cae037c3014350c923776548e71c9feb7a69259\snakeyaml-1.28.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\jakarta.validation\jakarta.validation-api\2.0.2\5eacc6522521f7eacb081f95cee1e231648461e7\jakarta.validation-api-2.0.2.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jsr310\2.12.5\a0a9870b681a72789c5c6bdc380e45ab719c6aa3\jackson-datatype-jsr310-2.12.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.module\jackson-module-parameter-names\2.12.5\2c85c2036d0851425a260c01eb5f7ddbed1eeb00\jackson-module-parameter-names-2.12.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jdk8\2.12.5\6b2f79547d217ad50dfc5b57af7444a3aa583b43\jackson-datatype-jdk8-2.12.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-databind\2.12.5\b064cf057f23d3d35390328c5030847efeffedde\jackson-databind-2.12.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-websocket\9.0.54\ae018906cecb818a8c6f2316d7b0793beadf6609\tomcat-embed-websocket-9.0.54.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-core\9.0.54\34322c731b2394ea13681cfae0be9cd72f46f88d\tomcat-embed-core-9.0.54.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-expression\5.3.12\50c82e995b3b8e20a3f313b4356237db5a26e14a\spring-expression-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\jakarta.xml.bind\jakarta.xml.bind-api\2.3.3\48e3b9cfc10752fba3521d6511f4165bea951801\jakarta.xml.bind-api-2.3.3.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.glassfish.jaxb\txw2\2.3.5\ec8930fa62e7b1758b1664d135f50c7abe86a4a3\txw2-2.3.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.sun.istack\istack-commons-runtime\3.0.12\cbbe1a62b0cc6c85972e99d52aaee350153dc530\istack-commons-runtime-3.0.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jcl\5.3.12\2b5f5bb4a78af879bd174ceff5226da3f014ab9d\spring-jcl-5.3.12.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.2.6\b09efa852337fa0dd9859614389eec58dc287116\logback-classic-1.2.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-to-slf4j\2.14.1\ce8a86a3f50a4304749828ce68e7478cafbc8039\log4j-to-slf4j-2.14.1.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.slf4j\jul-to-slf4j\1.7.32\8a055c04ab44e8e8326901cadf89080721348bdb\jul-to-slf4j-1.7.32.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-annotations\2.12.5\52d929d5bb21d0186fe24c09624cc3ee4bafc3b3\jackson-annotations-2.12.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-core\2.12.5\725e364cc71b80e60fa450bd06d75cdea7fb2d59\jackson-core-2.12.5.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.2.6\25be1abb32e870ff042e698a799b56587e0dca9a\logback-core-1.2.6.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.14.1\cd8858fbbde69f46bce8db1152c18a43328aae78\log4j-api-2.14.1.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.h2database\h2\1.4.200\f7533fe7cb8e99c87a43d325a77b4b678ad9031a\h2-1.4.200.jar;C:\Users\NOTE\.gradle\caches\modules-2\files-2.1\com.sun.activation\jakarta.activation\1.2.2\74548703f9851017ce2f556066659438019e7eb5\jakarta.activation-1.2.2.jar com.sss.subscriptionsharing.SubscriptionsharingApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.5.6) 2021-11-12 19:52:53.930 INFO 13244 --- [ main] c.s.s.SubscriptionsharingApplication : Starting SubscriptionsharingApplication using Java 11.0.11 on DESKTOP-N9VOSQK with PID 13244 (C:\springProjects\subscriptionsharing\out\production\classes started by NOTE in C:\springProjects\subscriptionsharing) 2021-11-12 19:52:53.933 INFO 13244 --- [ main] c.s.s.SubscriptionsharingApplication : No active profile set, falling back to default profiles: default 2021-11-12 19:52:54.540 INFO 13244 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2021-11-12 19:52:54.551 INFO 13244 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5 ms. Found 0 JPA repository interfaces. 2021-11-12 19:52:54.968 INFO 13244 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2021-11-12 19:52:54.977 INFO 13244 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2021-11-12 19:52:54.977 INFO 13244 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.54] 2021-11-12 19:52:55.083 INFO 13244 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2021-11-12 19:52:55.083 INFO 13244 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1109 ms 2021-11-12 19:52:55.184 INFO 13244 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2021-11-12 19:52:55.223 INFO 13244 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.32.Final 2021-11-12 19:52:55.326 INFO 13244 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2021-11-12 19:52:55.406 INFO 13244 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2021-11-12 19:52:55.445 INFO 13244 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2021-11-12 19:52:55.461 INFO 13244 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2021-11-12 19:52:55.626 INFO 13244 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2021-11-12 19:52:55.635 INFO 13244 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2021-11-12 19:52:55.674 WARN 13244 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2021-11-12 19:52:55.929 INFO 13244 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2021-11-12 19:52:55.938 INFO 13244 --- [ main] c.s.s.SubscriptionsharingApplication : Started SubscriptionsharingApplication in 2.627 seconds (JVM running for 4.267)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jar 파일 실행하는게 잘 되지 않습니다..
https://www.inflearn.com/questions/53961 이 글을 보고 git bash를 설치해서 인텔리제이에 적용하여 사용중입니다, 윈도우 환경에 자바 버전은 11입니다. java -jar 명령어를 사용해서 .jar 파일을 실행하는 과정이 잘 되지가 않습니다. 파일 이름이 demo-0.0.1-SNAPSHOT.jar 라서 java -jar demo-0.0.1-SNAPSHOT.jar 라는 명령어를 계속 입력했는데 아무 반응도 일어나지 않습니다. 뭐가 잘못된 걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드하고 실행하기에서 java -jar로 실행후 실행종료 어떻게 하는건가요?
8080포트의 PID를 킬해서 종료를했는데 그냥 종료하려면 어떤 명령어를 써야하나요?
-
해결됨스프링 시큐리티
FactoryBean관련해서 질문이 있습니다.
강사님 안녕하세요. 매번 질문만 하게 되는데 답변 친절히 해주셔서 감사합니다 ㅠ 강의를 보면서 궁금한 점이 있었는데 우선 첫번째로, FactoryBean으로 Map객체를 구현하는 이유가 있을까요? 만약 저에게 구현해보라고 한다면, UrlFilterInvocationSecurityMetadataSource에서 데이터들을 가져와서 한번에 했을 것 같은데.. 뭐 이런식으로.. FactoryBean으로 구현하신 이유는 DefaultFilterInvocationSecurityMetadataSource와 최대한 비슷하게 구현하기 위해서 그렇게 하신건가요? 두번째로, UrlResourceMapFactoryBean에서 if (resourceMap == null ) { init( ) }이라고 하셨는데, 이렇게 하신 이유가 무엇때문에 그런건가요? resourceMap은 호출때마다 DB에서 불러와야 하는 것 아닌가요? 항상 감사합니다 ..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 케이스 작성 질문드립니다
안녕하세요 스프링부트환경에서 junit 으로 테스트 케이스를 작성하고 테스트를 하는데 시간이 너무 오래걸리는데 단축할 수 있는 방법이 있는지 알고 싶습니다 테스트 케이스에서 @Autowired 로 서비스를 가져다 쓰고 있는데 실행할때마다 프로젝트의 모든 스프링빈들이 다 올라가고 테스트가 실행되는 것 같습니다 보통 실무에서는 어떻게 하는지 궁금합니다 어쩔 수 없는 부분인건지 아니면 실무에서는 테스트케이스에서 사용하는 서비스만 로딩해서 하는 방법으로 하는건지 잘 모르겠네요 실무에서는 어떤 방법을 써서 테스트 수행시간을 줄이나요? 만약 해당 서비스만 로딩해서 한다면 그 방법도 알고 싶습니다 감사합니다
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
springboot 로그 설정 질문 있습니다.
springboot 에서 http log 보는 설정이 뭐였죠? 어디선가 언급해줬는데 아무리 찾아봐도 어디인지 모르겠네요. 검색해도 안나오고 ...
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
도메인 주도 설계 강의도 만들어주세요~~
안녕하세요.cascade는 동일한 aggregate 에 포함되는 경우에 넣는거겠죠? 저희 예제에서 delivery는 order에서 cascade로 포함했는데 만약 다른 테이블에서 delivery를 참조하고 있으면 order_delivery 라고해서 별도의 테이블을 만들어도 되겠죠? 데이터 중복이지만 ddd에서 바운더리 컨텍스트 그런 개념에서 보면 문제가 없는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 반환 질문입니다
그 예전에 영한님께서 JSON으로 반환 할 때 쿼리를 통해서 얻은 값을 그대로 반환하지 말고 클래스로 묶어서 반환하라고 하셨던게 기억이 납니다. 쿼리를 통해서 얻은 결과가 예를들어 List<PersonDto> name : ~~~ age : ~~~ address: ~~ 이런식으로 되어 있을때 이 리스트를 그대로 반환하면 JSON 형식이 배열로 시작해서 그 후에 값을 수정 할 수 없다고 들었던거 같은데요!! 질문이 있습니다 저 List<PersonDto>를 감싸는 하나의 클래스를 만들때 예를 들어서 class PersonExmpleDto{ private ArrayList<PersonDto> persondto; ] 이런식으로 반환 할 때 클래스 이름을 어떻게 해야 할 지 모르겠습니다.... 쿼리를 통해서 얻은 List로 묶은 PersonDto를 하나의 클래스에서 반환하고자 할 때 클래스의 네이밍은 어떤식으로 하나요?class PersonListDto{ private ArrayList<PersonDto> persondto;} 이런식으로 하나요...??