묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
멀티스레드,서블릿 관련 질문드립니다
서블릿의 등장으로 인해 얻는이점이 멀티스레드처리를 지원한다고 이해했습니다. 제가 전에 공부했던 기억으론 웹브라우저와 웹서버가 통신을하는 형태가 되면서 네트워크프로그래밍, 멀티스레드 프로그래밍을 신경쓰지않아도 되게되었고, WAS에서는 비즈니스로직, UI로 직만 신경쓰면 된다 라고 공부했던 기억이 있습니다 제가봤던 부분의 그림입니다 조금 헷갈리는것이 1. 서블릿을 웹서버, 톰캣을 WAS 라고 보면 되는걸까요?? 2. 혹시 서블릿이 아니더라도 웹서버라면 어떤것이라도 멀티스레드 프로그래밍, 네트워크 프로그래밍을 신경쓰지않아도 되는것인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
update 쿼리를 날려도 이미 생성된 인스턴스에는 영향을 못 주는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강의에서 update 메서드로 member 인스턴스의 money를 변경해준 뒤 findById로 새롭게 불러와서 사용하길래 저는 궁금해서 그냥 기존 member 인스턴스에 그대로 검증해보니 값이 적용되어 있지 않더라구요. 쿼리로 값을 변경해줬으면 매번 인스턴스를 갱신해줘야 하나요? mysql에서 값을 update로 변경해줬으면 그걸 확인하기 위해 다시 select해줘야하는 것과 동일선상에서 생각하면 되는 걸까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Item 엔티티와 OrderItem 엔티티와의 일대다 관계 매핑
안녕하십니까 Order 엔티티와 OrderItem 엔티티의 일대다 관계에서는 @OneToMany(mappedBy = "order")private List<OrderItem> orderItems = new ArrayList<>();위와 같이 매핑을 해줬는데Item 엔티티와 OrderItem 엔티티의 일대다 관계에서는 매핑을 안해줘도 되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepositoryTest 실행시 오류
실행시 다음과 같은 에러가 발생합니다. initializationError() build.gradle 파일코드는 아래와 같습니다. plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java'}group = 'jpabook'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" }}test { useJUnitPlatform()}ylm 파일 띄어쓰기도 맞췄고, url의 MVCC=TRUE도 제거했으며build Tools > Gradle 도 IntelliJ IDEA로 맞췄는데어느부분이 문제인지 모르겠습니다.H2 콘솔도 잘 켠 것 같습니다만.. 어디가 잘못된걸까요..?
-
미해결스프링 핵심 원리 - 기본편
이너 static class
package hello.core.beanfind;import hello.core.AppConfig;import hello.core.repository.MemberRepository;import hello.core.repository.MemoryMemberRepository;import hello.core.service.MemberService;import org.junit.jupiter.api.Assertions;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.NoUniqueBeanDefinitionException;import org.springframework.beans.factory.UnsatisfiedDependencyException;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import static org.junit.jupiter.api.Assertions.*;public class ApplicationContextSameBeanFindTest { AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다") void findBeanByTypeDuplicate() { //DiscountPolicy bean = ac.getBean(MemberRepository.class); assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class)); } @Configuration static class SameBeanConfig{ @Bean public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2(){ return new MemoryMemberRepository(); } }이 코드에서 static이너클래스면 실행이 되고 그냥 이너클래스이면 안되는 이유가 뭔지궁금합니다.}
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
마이바티즈 스프링 모듈이 해주는 예외 변환
안녕하세요 항상 좋은 강의 감사합니다. 강의 마지막 즈음에 JDBC는 스프링 내부적으로, 마이바티즈는 스프링 마이바티즈 모듈이 예외변환 을해준다고 하셨는데, 그럼 예외 변환을 위한 @Repository의 AOP프록시 객체는 필요가 없는건가요 ? 확인해보니 @Repository를 붙이면 무조건 프록시 객체로 만들어 주는것 같은데. 마이바티즈나 JDBC템플릿을 사용할때는 Repository 객체를 꼭 프록시 객체로 만들어야 하나 싶은 의문이 듭니다! 마이바티즈나 JDBC템플릿을 사용할 때는@Component만 사용하여 빈등록을 하여도 괜찮을까요 ? 감사합니다!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Test updateItem() 질문있습니다.
안녕하세요 항상 좋은 강의 감사드립니다! Jpa강의를 예전에 이미 다들었는데, 아직 실무에서 안쓰다보니 가물가물한 하네요..ㅜ ItemRepositoryTest에 updateItem() 테스트를 보면 save한후 update하고, 그후 find를 하게 되어있습니다. save()를 했을 때 영속 컨텍스트에 데이터가 저장되고, update(), find()했을때는 영속 컨텍스트에서 데이터를 가져와 사용하고 커밋되기 전 롤백되기 떄문에 쿼리가 발생하지 않는 걸로 알고있습니다. 그런데 save()를 할때 insert 쿼리는 발생하는게 이해가 가질 않습니다. 커밋을 하지않았기 때문에 insert쿼리는 발생하지 않고 영속 컨텍스트에만 저장되어 있어야 하지않나 생각이듭니다.. 기초적인 질문이라 죄송합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의는 샀지만..
안녕하세요. 입문강의를 다 듣고 이제 다음 강의로 넘어가 보려고 합니다. 하지만 입문강의를 들었을때 좀 벅차다라는 생각이 들었습니다. 흐름은 알겠으나, 이해가 안되는부분을 생각해보면 .(점)이나 ()(괄호) 부분의 사용처 입니다. 막상 제가 혼자 개발을 한다고 생각해보면 ex) member1 = new MMR(); member2 = new MS(member1); Member finMember = memberService.finOne(SaveId).get(); Member member = em.find(Member.class, id); @GeneratedValue(strataegy = GenerationType.IDENTITY) 위 예제처럼 ()안에 들어갈 때와 의미 어떨때 들어가는지, .get()이 추가 의미 및 언제 사용하고 어느때 사용 하는지, Member.class 처럼 .class는 언제 어느때 들어가고 왜들어가는지.. @GeneratedValue에 GenerationType.IDENTITY 선택은 왜 했는지.. Ctrl + Q누르면 설명이 나오긴하는데 감이 안잡힙니다. 어느 핀트를 잡고 그 원리대로만 가면 되는건지... 강사님이 말씀하신것처럼 망망대해처럼 제가 뭐가 부족해서 어떻게 공부를 해야 할 지 잘 모르겠습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
리터럴 대체
th:onclick="|location.href='@{/basic/items/{itemId}/edit(itemId=${item.id})}'|"리터럴 대체하면 ${item.id}도 직접 사용할 수 있는거 아닌가요? 왜 아래는 오류가 나나요?th:onclick="|location.href='@{/basic/items/${item.id}/edit}'|"아래의 경우는 간단하게 대체가 가능한데 위는 왜 안되는지 궁금해요<td><a href="item.html" th:href="@{/basic/items/{itemId}(itemId=${item.id})}" th:text="${item.id}">회원id</a></td><td><a href="item.html" th:href="@{|/basic/items/${item.id}|}" th:text="${item.itemName}">상품명</a></td>
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Execution failed for task ':ServletApplication.main()'. 오류 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 이틀째 오류가 해결이 안되어 문의글 남깁니다. 여러번 검색후에 수정을 다 해보았는데 다음 단계로 넘어갈수가 없네요 ㅜㅜ 인텔리제이 무료버전 사용중이며 무료버전에서는 인텔리제이 오류가 있다는것을 보고 gradle로 변경하였습니다. (gradle이나 IntelliJ IDEA이나 오류는 같습니다!) 원래 자바 17버전을 사용중이였고 11버전으로 변경한 상태입니다. war로 설정했습니다. Execution failed for task ':ServletApplication.main()'.> Process 'command 'C:/Program Files/Java/jdk-11.0.2/bin/java.exe'' finished with non-zero exit value 1 * Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
constructor 생성 후
안녕하세요 Constructor 생성 후 강의에서는 memberService가 빨간줄인데 저는 빨간줄이 안나옵니다. 혹시 이유가 있을까요??
-
미해결스프링 핵심 원리 - 기본편
혹시 스프링 완전정복 로드맵의 마지막 강의인 스프링부트는 기존 스프링부트 로드맵의 강의와 무슨차이인가요?
관련글이 안보여서 질문남깁니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
static 내부클래스의 인스턴스화에 대한 질문
화면에서 Hello class를 static으로 정의한 이유가 따로 있는 건가요??? "helloApi 메서드" 블록 내부 첫줄에서. new연산자를 통해, Hello 인스턴스를 만드는데, 그러면 Hello class는 굳이 static이 아니라, static을 지워버려도 상관 없을거 같다는 생각이 들어서요. 혹시 static을 붙인 이유가 따로 있는 건가요? 소스에서 static을 지워버려도 구문오류같은건 보이지 않더라구요. 제 자바 문법의 깊이가 얕아서 그런지 몰라도, static으로 정의한 메서드나 클래스 같은 경우, 보통 인스턴스화 시키지 않는것 같아서요 그리고 Hello class가 static으로 정의되어 있어서, 별도의 인스턴스 생성없이, Hello.setName()으로 접근가능할 줄 알았는데... 구문오류가 발생하던데... 이건 왜일까요...? [
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberRepository에서 findByName 메서드
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 저는 중복 이름 허용하려고 이렇게 두신 줄 알았는데 여기서 보니까 중복 이름을 허용하지 않으시더라구요 그럴거면 굳이 List로 반환 받을 필요 없고 getSingleResult로 받아도 상관 없는 건가요? 실제 성능이나 이런 건 아무 관계 없겠지만 의미상 저게 더 맞는 것 같아서요. 그리고 id가 서비스에서 추가하는 시점에서 생성되어 있지 않기 때문에 이름으로 검증하는 것으로 알고 있는데, 만약 중복 이름을 허용하고 싶으면 어느 시점에서 검증해야 할까요?
-
해결됨스프링 핵심 원리 - 고급편
@Import(AppV1Config.class) 질문있습니다.
안녕하세요. 강사님!한가지 궁금한 사항이 있어서 질문드립니다. 강의에서 필요한 컴포넌트만 스캔하기 위해서 hello.proxy.app 하위만 scanBasePackages로 설정해주셨는데 별개로 AppV1Config 클래스를 bean 으로 등록하기 위해서 ProxyApplication 클래스위에 @Import(AppV1Config.class)를 선언하셨었는데, 어떻게 AppV1Config 클래스가 독립적으로 빈으로 등록되는지 상세하게 알수있을까요? 공식 doc을 봐도 이해가 안되네요 ㅠㅠ AppV1Config 클래스에 적용된 @Configuration 어노테이션을 까보니 @Component 어노테이션이 적용되었지만, 애플리케이션 기동시에는 @SpringBootAppilcation 어노테이션의 scanBasePackages를 hello.porxy.app 하위로 적용했기 때문에 hello.proxy.config 하위에 있는 AppV1Config가 무시되지는 않나 싶어서요 공홈을 보니까 There's no problem in declaring all the configurations. But imagine the trouble to control dozens of configuration classes within different sources. There should be a better way. The @Import annotation has a solution, by its capability to group Configuration classes:이렇게 설명이 되어있는데 혹시 hello.proxy.app 하위로 컴포넌트 스캔을 할 경우 @Import에 있는 Configuration으로 등록되어 있는 AppV1Config 파일도 함께 grouping 되어서 스캔되는 원리일까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
쓰레드 풀 관련 질문 드립니다.
쓰레드 풀 관련해서 질문드립니다.강의 예제에서 HTTP 요청이 들어온경우 연결 이후 쓰레드 풀에서 쓰레드를 할당해주는 것 이라고 이해했는데. 문득 이런 궁금점이 들었습니다.요청이 들어왔을 때 '연결'을하고, 이에 대한 '응답' 을 하는 것도 쓰레드가 해줘야 하는 일이 아닌가요? 프로세스의 가장 작은 단위 이기 때문에 이런 '연결' 과 '응답'도 쓰레드가 결국해줘야 한다고 생각했습니다 그렇다면 이런 연결과 응답을 책임지는 쓰레드도 톰캣 내부에 있는 (쓰레드 풀)에 있는 쓰레드를 쓰는건가요..?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
일부 파일에서는 파라미터가 필요없을경우 어떻게하는게 맞을까요?
강의의 base와같은 기본 레이아웃이 있으며 파라미터 a,b,c를 받습니다 또한 이것을 호출 하는 html파일 a,b,c가있습니다 a와 c에서는 세가지 파라미터를 다 넣어주지만 b에서는 파라미터중 하나만을 사용해서 나머지 두 파라미터를 넘겨주지 않으려고합니다 넘겨주지 않는다면 에러가 나고 파라미터를 넘겨주기 위해 무의미한 태그를 두개 만들자니 좋지않아 보이는데 어떤식으로 하는게 적당할까요
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
[JPA와 DB 설정, 동작확인] import Assert 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요, 현재 <JPA와 DB 설정, 동작확인> 내용을 (09:13) 따라가면서 듣고 있는데 import하는 Assert 부분에서 오류가 납니다. <강의> <내 코드> 구글링해서 찾아보니까 (https://aonee.tistory.com/2) build.gradle에 밑 내용 넣으면 된다고 하는데 다른 방법이 있나요? 강의에서는 안 넣어도 잘 되는 것 같아서 여쭤봅니다. 또 제가 devtools 동작오류가 있어서 (https://www.inflearn.com/course/스프링부트-JPA-활용-1/unit/24277?tab=community&q=152186) 질문에서 알려준 사이트 내용대로 build.gradle에 apply plugin: 'idea'를 적었습니다. 저는 이 부분을 바꾸지 않는 선에서 오류를 해결하고 싶어서 다른 방법을 찾고 싶습니다. 추가) 비슷한 질문 보니까 build.gradle를 올리면 좋다고 하셔서 추가합니다. https://www.inflearn.com/course/스프링부트-JPA-활용-1/unit/24279?tab=community&q=580709 <bulid.gradle> plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java'}apply plugin: 'idea'group = 'jpabook'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') { useJUnitPlatform()}
-
미해결스프링 핵심 원리 - 고급편
컨트롤러 프록시가 어떻게 호출되는지 잘 모르겠습니다
인터페이스에 GetMapping이 되어있고 이 인터페이스를 Impl 구현체와 프록시가 각각 구현하고 있는데 어떤 이유로 Impl이 아닌 프록시가 호출되는지 잘 모르겠습니다. 마찬가지로 구체클레스에 적용하는 V2도 OrderController가 아닌 이것을 상속받은 프록시가 호출되는 이유가 궁금합니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
아규먼트 리졸버를 이용한 로그인 처리 관련 질문 입니다.
안녕하세요. 두 가지 궁금한 점이 있는데요. 우선, 컨트롤러가 RequestBody 나 HttpEntity 로 파라미터를 받을때는 아규먼트 리졸버가 항상 메세지 컨버터를 사용했었는데요. ArgumentResolver 강의에서는 아규먼트 리졸버가 세션으로 부터 Member 객체를 꺼내서 넘겨주는 시점에서 이미 컨트롤러에서 받는 Member 객체와 이미 타입이 일치하기 때문에 메세지 컨버터가 하는 역할은 여기서는 필요없다고 보면 될까요? 두번째 질문은, 인터셉터에서 이미 로그인 체크를 해서 로그인이 안되었을 경우 로그인 페이지로 리다이렉션을 하고 있는데 컨트롤러내에서 굳이 loginMember == null 을 체크해서 리다이렉션을 다시 처리해 주어야 하는지 궁금합니다. 실무에서는 로그인이 필요한 요청 핸들러 메소드에서는 로그인 체크가 이미 인터셉터에서 처리 되고 비인증 사용자는 인터셉터에서 걸러져서 핸들러 어뎁터 까지 오지 않는게 바람직한 처리라고 보면 될까요?