게시글
질문&답변
9강 18분즈음 속성값에 Label1Text가 안뜹니다.
잘 해결 됐습니다
- 0
- 2
- 24
질문&답변
application.properties 수정을 해줘도 에러가 납니다.
멤버서비스 임플 생성자 이렇게 수정해줘도 에러가 뜨네요 @Autowired public MemberServiceImpl(@Qualifier("memoryMemberRepository") MemberRepository memberRepository) { this.memberRepository = memberRepository; }
- 0
- 3
- 55
질문&답변
applcation.properties 수정해도 에러가 납니다.
두 클래스 보여드릴게요 package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @Configuration //안붙여도 스프링 컨테이너에 스프링 빈로 다 등록됩니다 애를 빼고 테스트시 순수한 앱구성이 출력됨 근데 이렇게 되면 다른 싱글톤이 깨짐 출력이 5개 전체 출력됨 public class AppConfig { //@Bean memberService -> new MemoryMemberRepository() //@Bean orderService -> new MemoryMemberRepository() 이렇게 하면 싱글톤이 깨지지 않을까요?? //이 골뱅이 빈이면 컨텐츠 앱이 들어와요 //call AppConfig.memberService //call AppConfig.memberRepository //call AppConfig.memberRepository //call AppConfig.orderService //call AppConfig.memberRepository //실제 테스트 돌려보니 //call AppConfig.memberService //call AppConfig.memberRepository -> 이게 세번호출되어야 하는데 한번만 호출 된 신기한 상황 스프링이 정말 어떠한 방법을 써서라도 싱글톤을 보장해 주는구나 라는 걸 아실 수 있음 //call AppConfig.orderService //appconfig에 비밀이 있다. //이 골뱅이 빈이 붙은 메서드마다 이미 스프링빈이 존재하면 존재하는 빈을 //반환하고 스프링빈이 없으면 새로 생성해서 스프링빈으로 등록해서 반환하는 코드가 동적으로 //만들어지는 거예요 이덕분에 싱글톤이 보장되는거에요 없으면 스프링빈등록, 있으면 기존에 꺼내서 반환 그렇기 때문에 세번 호출되는게 아니라 한번만 호출 이미 등록이 되있어서 // @Autowired MemberRepository memberRepository;//이렇게하면 Configuration 없애도 해결이됨 의존관계 주입 그러면 스프링에서 다시 끌어온 거를 집어넣어 주는 거거든요 @Bean public MemberService memberService(){// 멤버서비스가 빈의 이름 System.out.println("call AppConfig.memberService");//soutm return new MemberServiceImpl(memberRepository());// ctrl+alt+m 리턴해서 new해서 반환하는 요 객체를 빈 객체로 등록해준다. 요거를 스프링 빈이라고 한다. }// 빈 이름은 항상 다른 이름을 부여 @Bean public MemberRepository memberRepository() { System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public OrderService orderService() { System.out.println("call AppConfig.orderService"); return new OrderServiceImpl(memberRepository(),discountPolicy());//이렇게 주입된걸 넣어주면 테스트 통과됨, 주소값도 같음 } @Bean public DiscountPolicy discountPolicy() { //return new FixDiscountPolicy();// 할인 정책에대한 객체를 바꾼다. return new RateDiscountPolicy(); } }package hello.core; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.springframework.context.annotation.*; @Configuration//설정정보니까 @ComponentScan//스프링빈을 쫙 긁어 가지고 자동으로 스프링 빈으로 끌어올려야 된다. ( basePackages = "hello.core.member",//이 위치에서부터 찾아서 들어가는 것 이렇게 해갖고 멤버부터 컴포넌트 스캔 대상이 된다 basePackageClasses = AutoAppConfig.class,//지정한 클래스의 패키지를 탐색 시작 위치로 지정한다. 지정 안하면 디폴트 excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) )//컴포넌트 스캔을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록되기 때문에, AppConfig, TestConfig 등 앞서 만들어두었던 설정 정보도 함께 등록되고, 실행되어 버린다. 그래서 excludeFilters를 이용해서 설정정보는 컴포넌트 스캔 대상에서 제외했다. public class AutoAppConfig {//테스트 결과 memberService2, memoryMemberRepository 이두가지만 입력 됨 @Bean(name= "memoryMemberRepository") @Primary //한 빈을 기본적으로 사용하고 싶다면 그 빈에 @Primary 어노테이션을 추가하세요. public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } }// 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것, 프로젝트 시작루트에 두는게 좋음, componentScane->스프링 빈 자동 등록 SpringBootApplication ctrl+클릭해보면 알수 있다. //컴포넌트 스캔 기본 대상 컨트롤러, 서비스, 리포지터리, 컨피규레이션 다 스프링 빈 등록 어노테이션 상속이나, 연동되는 기능없다.
- 0
- 2
- 35
질문&답변
404에러가 계속 뜹니다.
그럼 답변 내용만 봤을땐 아무문제 없는건데 왜그러죠 그래들 리프레쉬도 수차례하고 컨트롤러 url 경로 폴더경로 다 문제 없는건데요..
- 0
- 2
- 127
질문&답변
404에러에 관한 질문 static 폴더밑의 jsp 파일조차 실행안됩니다.
build.gradle.kts 파일을 보내드리겠습니다.plugins { java alias(libs.plugins.spring.boot) alias(libs.plugins.spring.dependency.management) id("jacoco") } configurations { compileOnly { extendsFrom(configurations.annotationProcessor.get()) } } allprojects { group = property("app.group").toString() } dependencyManagement { imports { mavenBom(libs.spring.cloud.dependencies.get().toString()) } } dependencies { implementation(libs.spring.boot.starter.web) 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.apache.tomcat.embed:tomcat-embed-jasper") implementation("javax.servlet:javax.servlet-api:4.0.1") implementation ("javax.servlet:jstl") compileOnly(libs.lombok) annotationProcessor(libs.lombok) annotationProcessor(libs.spring.boot.configuration.processor) testImplementation(libs.spring.boot.starter.test) } // about source and compilation java { sourceCompatibility = JavaVersion.VERSION_17 } with(extensions.getByType(JacocoPluginExtension::class.java)) { toolVersion = "0.8.7" } // bundling tasks tasks.getByName("bootJar") { enabled = true } tasks.getByName("jar") { enabled = false } // test tasks tasks.test { ignoreFailures = true useJUnitPlatform() }
- 0
- 3
- 223
질문&답변
08:55 테스트 이후에 파라미터 id 값을넣어도 에러가 뜹니다.
이렇게 설정하니 되네요dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' // implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' // testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } testRuntimeOnly 'org.junit.platform:junit-platform-launcher' }
- 0
- 2
- 133