묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
session을 DB에 저장하지는 않나요??
session을 생성할 때 public void createSession(Object value, HttpServletResponse response){ //세션 id를 생성하고, 값을 세션에 저장 String sessionId = UUID.randomUUID().toString(); sessionStore.put(sessionId, value); //쿠키 생성 Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); response.addCookie(mySessionCookie);} 이 소스에서는 sessionStore에 담아놓았는데.. 실제 운영을 할 때도 저렇게 ConcurrentHashMap에만 담아놓고 사용을 하나요?? 아니면 DB에 아이디와 세션값을 따로 저장을 할까요?? 어차피 새션값은 고유값이기는 하지만 일정 시간이 지나면 변경이 되는 값이라 굳이 DB에 테이블을 만들어서 저장을 하지는 않을 것 같은데 실제로 개발을 하고 운영을 할 때도 저렇게 ConcurrentHashMap에만 담아놓고 끝나는지, 아니면 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는 만들지않고 정적 팩토리 메소드를 활용해서 변경감지 로직을 짜봤는데 제대로 짠건지 잘 모르겠네요. 여기서 더 수정 하자면 어떤부분을 고치면 좋을까요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
intellij 실행이 안됩니다.
강의 정말 잘 듣고있습니다. intellij실행에서 막혔습니다. os는 mac이고, 강사님 따라서 intellij를 처음 다운로드해서 사용해봅니다. Error: Could not find or load main class Caused by: java.lang.ClassNotFoundException: 실행하면 이런에러가 발생하는데 이유가 무엇인가요 ? (main class 중에 제 프로젝트 내용이 나오지 않습니다.)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성 메서드란게 정적 팩토리 메서드를 말하는건가요??
정적 팩토리 메서드와 코드가 엄청 유사한데 객체 생성을 위한 메서드로 이해하면 될까요??
-
미해결스프링 핵심 원리 - 기본편
Bean 메타정보 관련 동작, 스프링 컨테이너에 등록되는 과정이 궁금합니다.
안녕하세요. 항상 양질의 답변 글을 달아주셔서 너무 감사합니다. 다름이 아니라 이전 강의를 복습하면서, 제가 궁금한 부분이 있어 질문 드리고 싶어 글을 적습니다. Bean Definition을 통해서 스프링 컨테이너에 등록되는 과정이 궁금한데, 한번 이런 흐름으로 가는데 틀린 부분이 없는지 봐주실 수 있을까요? 전체 흐름이 맞는지, 그리고 각 과정에서 잘못 알고 있는 부분은 없는지 한번 알려주시면 감사하겠습니다. 1. 스프링부트가 시작되면 @Configuration이 붙은 AppConfig 클래스를 자동으로 스캔해서 스프링 컨테이너에 넣는다 2. 스프링 컨테이너, 여기서는 ApplicationContext의 구현체인 AnnotationApplicationContext가 AppConfig.class 정보를 AnnotatedReader를 통해서 읽은 다음 @Bean이 붙은 Bean Definition을 만든다. 3. 만들어진 Bean Definition을 AnnotationApplicationContext에서 읽어서 빈 객체를 생성해서 내부 빈 저장소에 저장한다. 이 때, 각 메서드는 @ComponentScan에서 생성자 주입과는 다르게 동작한다 (생성자 주입은 빈 객체를 생성하면서 의존관계 주입 설정 완료) 4. 의존관계 주입 단계에서 각 Bean Definition을 참고해서 Bean 간의 의존 관계를 설정해준다. 이 때, 생성 방식은 Bean Factory Interface의 구현체인 AnnotationContext로 했기 때문에 Bean Factory Method 방식으로 Bean Definition이 생성되었다. 앞뒤 내용을 조합해보면, 이렇게 될 것 같은데.. 혹시 틀린 부분이 없을지 같이 한번 봐주실 수 있으실까요? 항상 많은 가르침 주셔서 너무 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
SSR CSR 의 차이에 대해서 질문이 있습니다.
강의 내용중, SSR은 서버단에서 동적으로 HTML생성해서 타임리프를 통해서 만들어 웹브라우저로 뿌려주고, CSR은 자바스크립트 요청을 하여 서버단에서 관련 데이터들만 뿌려주고 웹 브라우저 자체에서 자바스크립트를 통해 HTML결과를 렌더링 한다고 인지하였습니다. 그런데 13:50정도의 내용에서는 SSR은 정적인 페이지, CSR은 동적인 페이지에서 사용된다고 하셨습니다. (여기서 질문입니다) 1. 제가 인지한 정적페이지는 정말 사용자마다의 정보없이 모든사용자에게 똑같이 내려줄법한 페이지를 의미하고 동적페이지는 사용자마다 정보다 다르기에 DB를 통해 가져와 동적으로 자용자마다 큰틀은 비슷하지만 정보표시 자체가 다르게 되어서 동적페이지라고 인지하였습니다. 맞나요? 2. 저같은 경우 UI를 비쥬얼 스튜디오 코드 같은곳에서 이쁘게 꾸민후 해당 프론트코드 와 인텔리제이에서 만든 백앤드 코드를 합치고싶은데 이럴땐 어떻게 연동을 해주나요? 3. 또한 저는 개인 프로젝트를 할때 리엑트 같은 CSR기술을 사용해보려고 하는데, 이럴땐 리엑트로 HTML렌더링 웹사이트를 만들어준후, 정보를 작업하는 백엔드쪽은 인텔리제이같은 툴을 이용하여 데이터를 만든후 제가 만든 리엑트 웹사이트에 뿌려주게 되는건가요? 방식이 궁금합니다.
-
해결됨실전! 스프링 부트와 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();
-
미해결스프링 핵심 원리 - 고급편
@Import(AppV1Config.class)질문있습니다.
현재 강의에서 AppV1Config클래스를 스프링빈으로 등록하기 위해 @Import(AppV1Config.class)코드를 넣어줘야한다고 알려주셨습니다. 그런데 예전강의에서 @Configuration안에는 @Component가 선언되어 있어 해당 클래스는 자동으로 스프링빈으로 선언된다고 알려주셨는데요!! 그렇다면 @Import(AppV1Config.class)코드가 없이 @SpringBootApplication(scanBasePachages)가 지정되어 있지않다면 AppV1Config클래스는 자동으로 스프링빈으로 등록되는게 맞나요??
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인라인 사용일 때에 내추럴탬플릿에 대해서 여쭤봅니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] <script th:inline="javascript"> 1번) var username = [[${user.username}]];//자바스크립트 내추럴 템플릿2번) var username2 = /*[[${user.username}]]*/ "test username"; </script> 위 내용에서 내추럴 템플릿을 쓰는 이유가 궁금합니다.1번)처럼 그냥 넣어줘도 userA가 나올텐데, 굳이/* */ 이렇게 사용하고, 뒤에 "test username" 이라는 값을넣어야 하는 이유가 따로 있는지 궁금 합니다.어차피 인라인 자바스크립트이고결과값이 같은 값이 나올텐데..2번처럼 사용하는 때가 따로 있는지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
어플리케이션 계층이 예제에 있는 것인지 궁금합니다.
안녕하세요. 도메인 주도 모델을 공부하면서 강의를 복습하고 있습니다. 비즈니스 로직이 Entity 객체에 들어가는 이유 등은 조금씩 이해가 가고 있는 중입니다. 그런데 제가 경험이 없다보니 이론서와 예제를 비교하다 보니까 다른 점이 몇 가지 있어서 실제로는 반드시 이론대로 사용하는 것은 아닌가? 라는 생각도 들고 학습을 위해서 간단히 만드신 건가 잘 모르겠어서 질문드려봅니다. 도메인 주도 설계 아키텍쳐를 보면 1 프레젠테이션 계층 2 애플리케이션 계층3 도메인 계층4 인프라스트럭처 계층 이렇게 나누어진다고 하는데요. 여기서 1 프레젠테이션 계층이 MVC이고 영상에서 나오는 controller domain service는 3 도메인 계층으로 보입니다. 그런데 2 애플리케이션 계층은 보이지 않고 애플리케이션 계층이 와야 할 자리에 도메인 계층이 있는 것처럼 보입니다. 예를 들면 도메인 객체인 Entity나 Repository가 Controller에서 사용되고 있습니다. 이론서를 보면 컨트롤러에서는 도메인 계층의 구현을 알지 않는 것이 좋으며, 모든 도메인 계층에 대한 호출은 어플리케이션 계층 안에서(ex entityApplicationService Class 안에서) 이루어지는게 좋다고 하더라고요. 실무에서도 예제처럼 어플리케이션 계층을 생략하고 할 때가 많나요? 아니면 강의에서는 학습용으로 생략이 된 것인지 제가 무언가 간과하고 있는 부분이 있는지 궁금해서 이렇게 질문드리게 되었습니다.
-
미해결스프링 핵심 원리 - 고급편
강사님 궁금한게 있습니다.
항상 좋은 강의 감사합니다! 덕분에 실력이 많이 오름을 느끼고 있습니다. 궁금한 것은 애초에 boot-starter-aop을 적용하기 전에, 스프링 컨테이너에 빈들을 등록할때 이들을 프록시 처리해서 등록하는 것으로 알고 있습니다. (싱글톤 처리를 위해서) 이때, boot-starter-aop 모듈을 적용하면 이러한 역학 과정(?)에 어떤 과정이 들어가는지 궁금합니다. 일단 포인트컷 대상이 되는 클래스는 한번 프록시에 감싸주고 이후 스프링에서 빈으로 등록할 때 싱글톤 처리를 위해 한번 더 프록시를 감싸주는 식으로 최종 빈 등록이 되는 것일까요?
-
미해결스프링 배치
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
-
미해결스프링 핵심 원리 - 기본편
Proxy Mode 객체 관련 문의드립니다.
안녕하세요. 항상 좋은 답변 주셔 감사합니다. Proxy Mode 객체 관련 문의드릴 것이 있어 질문글을 적습니다. 영한님께서 강의 중에 Proxy Mode 객체는 계속 생성이 되니, 싱글톤 스코프처럼 사용 시 문제가 발생할 수 있으니 주의를 해야한다고 말씀을 해주셨는데... 조금 헷갈려서.. 관련해서 질문드리고 싶습니다. 1. Proxy Mode를 사용했을 때, CGLIB를 활용한 빈 객체는 스프링 컨테이너가 생성될 때 최초로 단 한 번만 생성된다. 프록시 객체가 호출되면, 호출될 때 마다 진짜 객체를 만든다. 위의 내용처럼 이해를 하는 것이 맞을까요? 그리고 싱글톤 스코프처럼 사용 시 문제가 발생할 수 있다는 것은 프록시 객체는 단 한번 생성되나, 진짜 객체는 매번 생성되고 소멸되니 그것에 대한 COST가 비싸다는 것으로 이해를 하면 될까요? 2. 이 강의해서 사용된 REQUEST 스코프의 동작 방식이 궁금합니다. 사용된 코드 동작방식을 보면 HTTP REQUEST가 들어오면 REQUEST SCOPE 객체를 만들고 나갈 때까지객체를 유지하고, 나간다면 다음으로 들어온 HTTP REQUEST를 입력받아서 동작하는 것처럼 보입니다. 즉, 항상 HTTP REQUEST SCOPE 객체는 스프링 컨테이너에 하나만 존재하는 것처럼 보입니다. 그런데 예를 들어 정말 동시에 HTTP REQUEST가 들어오면, 어떻게 동작하는지 알 수 있을까요? 동시에 들어오면 HTTP REQUEST SCOPE 빈이 스프링 컨테이너에 다수 개가 생성될 것 같아서... 기존에 컨트롤러와 서비스가 동작하던 것처럼 동작하지 않을 것 같습니다. 항상 좋은 답변 달아주셔서 감사합니다.
-
미해결실전! 스프링 부트와 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 2편 - 백엔드 웹 개발 활용 기술
템플릿을 만들 때 태그가 중복되면 어떻게 되나요?
테스트를 해 보니 전체 공통 레이아웃을 만들어서 사용을 할 때 layoutFile.html 파일에서 title, content를 넘기고 받는 페이지에서 <title>, <content> 테그를 사용해서 레이아웃을 페이지별로 랜더링을 하는데.. 만약 받는 파일에서 section 으로 받아서 적용을 시킬 때 받는쪽 html 에서 section이 여러개 있을 경우에는 section을 사용하는 여러 테그영역 모두가 바뀌어 버리는데 여러개의 section을 사용을 할 경우에는 특정 section중 원하는 section을 선택해서 적용을 할 수 있는 방법이 있을까요??? 그리고 사용할 수 있는 테그는 html에 있는 테그들만 사용을 할 수 있나요?? 아니면 <breadcrumb></breadcrumb> 이런식으로 임의로 만들어서 사용을 할 수도 있는건가요?? 만약 임의로 만들어서 사용을 한다면 html표준에 맞지 않는데.. 전체 레이아웃을 유지한 상태에서 군데군데 바꿔야 하는 부분이 여러군데이고, 겹치는 테그들이 있을 경우에는 어떤식으로 사용을 하는것이 가장 좋을까요?
-
미해결스프링 핵심 원리 - 기본편
static class의 생성자 주입 의존관계 주입 관련
안녕하세요, 항상 강의 잘 보고 있습니다. 강의 복습하던 도중, 도무지 동작이 이해가 안되는 부분이 있어 문의드리고자 글을 적습니다. static class DiscountService { private final Map<String, DiscountPolicy> discountPolicyMap; private final List<DiscountPolicy> discountPolicyList; // AutoWired를 활용한 주입. public DiscountService(Map<String, DiscountPolicy> discountPolicyMap, List<DiscountPolicy> discountPolicyList) { this.discountPolicyMap = discountPolicyMap; this.discountPolicyList = discountPolicyList; } 문의 드리고자 하는 부분은 위의 생성자 부분입니다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); 위처럼 DiscountService.class를 AnnotationConfigContext에 등록하면, 스프링 컨테이너에서 DiscountService.class에 대한 스프링 빈을 등록하는 것으로 알고 있습니다. DiscountService의 생성자를 통해 스프링 빈을 등록할 때, discountPolicyMap, discountPolicyList는 어디서 주입을 받는지 모르겠습니다. 왜냐하면 다른 클래스 코드에서 @ComponentScan을 통해서 등록하는 것은 FixDiscountPolicy, RateDiscountPolicy 빈 객체를 등록하는 것이지 MAP 혹은 LIST 형태로 빈 객체를 등록하지 않는 것으로 알고 있기 때문입니다. 그렇다면 지금 스프링 컨테이너의 빈 저장소에는 FixDiscountPolicy와 RateDiscountPolicy만 빈 객체로 저장이 되어있을텐데, 이 녀석들이 어떻게 discountPolicyMap 형태로 변경이 되어서 생성자 주입이 되는지 동작을 세분화해서 알려주시면 너무 감사드리겠습니다. 항상 좋은 답변 주셔서 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
AutoAppConfig에서 @Configuration을 @Component로 해도 무관한가요?
안녕하세요 ! AutoAppConfig 클래스에서 @Configuration을 사용하는 이유가 너무 궁금했는데, 이전에 질문글에 답변을 보고 @ComponentScan 기능이 AutoAppConfig 클래스가 스프링 빈으로 등록돼야 활성화 되기 때문이라고 이해했습니다. (@Configuration 내부에 @Componet가 있기 때문에) 질문 1. 보통 애노테이션을 사용할 때 @Service, @Controller처럼 내부에 들어있는 기능은 비슷하지만 해당 클래스가 가진 역할을 명시하는 역할도 하는 것 같아요 ! AutoAppConfig도 사실 @Component를 사용해도 되지만 개발자들이 더 명시적으로 이해할 수 있도록 @Configuration을 사용하게 된건가요? (이전 강의를 통해서 스프링 빈을 컨테이너에 등록해서 싱글톤을 위함인 이유는 알고 있습니다 ㅎㅎ , 그런데 @Bean을 사용해도 싱글톤이 유지되는데 @Configuration을 사용하는 이유는 잘 모르겠네요.. ㅠㅠ 이것또한...명시적인 이해를 위함일까요??) 질문 2. CoreApplication 클래스 즉, 실행 클래스에 @SpringBootApplication 애노테이션 내부를 보면 @ComponentScan이 있는데요 ! AutoAppConfig에서 @ComponentScan을 해준 이유는, 스프링 빈을 등록할 범위를 제한하기 위함이었나요? ㅎㅎ 사실 처음에는, @ComponentScan을 하게되면 스프링 컨테이너에 @Component가 붙은 클래스가 스프링 빈으로 등록되는데, AutoAppConfig에서 컴포넌트 스캔 어노테이션을 붙이게 되면, 해당 클래스에 빈이 등록되는..터무니 없는 생각을 하게 되었습니다 ㅋㅋ... 보통 실무에서 @Configuration @ComponentScan 조합을 사용하는지, 아니면 CoreApplication에서 @SpringBootApplication 애노테이션으로 빈을 등록하게 되는 경우가 많은지 궁금하네요 ㅎㅎ 혹시 제가 언급한 것 중에 잘못된 지식이 있다면 가감없이 지적 부탁드리겠습니다 !! 긴 글 읽어주셔서 감사합니다 ㅎㅎ
-
미해결스프링 핵심 원리 - 기본편
findById(Long memberId)가 궁금합니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요 선생님 강의 즐겁게 잘 보고 있습니다! 4:40부터 회원저장소와 회원서비스 인터페이스에 메서드를 작성하는 것부터 흐름이 진행되기 시작하는 곳을 무작정 외우려다가 이해하고 싶어서 질문드립니다. 1. Member의 getId()를 쓰지않고 findById()를 쓰신 이유가 궁금합니다. 2. 1이 어떻게 가능한건지 잘 이해가 가지 않습니다. 저의 어떤 기초지식이 부족해서 이해를 못하는 건지 파악이 안 되는 상황이고 도움을 요청드립니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 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 라는 명령어를 계속 입력했는데 아무 반응도 일어나지 않습니다. 뭐가 잘못된 걸까요?