묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceIntegrationTest 오류 질문드립니다.
antlr.NoViableAltException: unexpected token:generatedAlias0org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: generatedAlias0 near line 1, column 8 [select generatedAlias0 from...] 이 부분에서 계속 에러가 뜨는데 이유를 모르겠어서 질문드려요!참고로 이와 비슷한 문의 글도 인프런과 stackoverflow에서 봤지만, 마땅한 오타가 없어서 여기에 글 올립니다! // MemberServiceIntegrationTest import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Commit; import org.springframework.transaction.annotation.Transactional; import with.younghan.kim.domain.Member; import with.younghan.kim.repository.MemberRepository; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @SpringBootTest @Transactional class MemberServiceIntegrationTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test void 회원가입() { //given Member member = new Member(); member.setName("spring100"); //when Long saveId = memberService.join(member); //then Member findMember = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test public void 중복_회원_예외() { //given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //when memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } } // MemberService import org.springframework.transaction.annotation.Transactional; import with.younghan.kim.domain.Member; import with.younghan.kim.repository.MemberRepository; import java.util.List; import java.util.Optional; @Transactional public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } /** * 회원 가입 */ public Long join(Member member) { validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); } /** * 전체 회원 조회 */ public List<Member> findMembers() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId) { return memberRepository.findById(memberId); } } // JpaMemberRepository import with.younghan.kim.domain.Member; import javax.persistence.EntityManager; import java.util.List; import java.util.Optional; public class JpaMemberRepository implements MemberRepository { private final EntityManager em; public JpaMemberRepository(EntityManager em) { this.em = em; } @Override public Member save(Member member) { em.persist(member); return member; } @Override public Optional<Member> findById(Long id) { Member member = em.find(Member.class, id); return Optional.ofNullable(member); } @Override public Optional<Member> findByName(String name) { List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); return result.stream().findAny(); } @Override public List<Member> findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } } // Member import javax.persistence.*; @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
재밌게 잘 보고있습니다.
1배속이지만 다른강의 2배속 느낌이네요.. 이게 실무인가 싶기도 하고 ㅎ_ㅎ 특정 메서드를 만들면, throw new 이후 나오는 건 따로 설정을 하신거려나요?
-
해결됨토비의 스프링 부트 - 이해와 원리
`@ConditionalOnClass` 관련 문의
안녕하세요! 강의에서 한가지 궁금한 점이 있어서 질문드립니다!@ConditionalOnClass 어노테이션에서 XmlMapper.class 는 빨간 줄로 나와서 찾아보니import com.fasterxml.jackson.dataformat.xml.XmlMapper;가 resolve 되지 못하는 것으로 추측되었습니다. 이런 경우는 빌드가 되지 않아야 하는 것이 아닌가 싶어서 제가 무엇을 놓치고 있는 것인지 알고 싶어 문의드립니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
로그인 및 권한관리 관련한 부분을 다루신 강의가 있나요??
기능들 구현하는 부분을 따라해보면서 공부하고 있는 시작 단계입니다. 로그인과 권한관리를 다루고 구현하는 기능들의 중요성과 필요성을 느꼈는데 해당 강의에서는 위의 기능은 배제한다고 하셔서 해당부분에 대해 강사님께서 다루신 관련 강의가 있나요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew 이후 실행안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.인텔리제이 와 Git Bash 연동을 하고 Alt + F12 눌러서 터미널 실행했습니다../gradlew build 와 cd build/libs 까지 성공했는데java -jar hello-spring-0.0.1-SNAPSHOT.jar 는 엔터를 눌러도 아무일도 일어나지 않네요파일의 권한이 rw 밖에 없어서 그런거 같아서 chmod 777 hello-spring-0.0.1=SNAPSHOT.jar로 실행 권한을 부여하려고 했는데도 실행 권한이 바뀌지가 않네요....어떻게 해야 해당 자바 파일 실행할 수 있을까요
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
docker 네트워크는 물리적으로 다른 ip에서도 연동가능한가요?
안녕하세요 이 강의를 통해 처음으로 docker를 학습하고 있는 중인데, 궁금한게 있습니다.docker 네트워크를 사용해서 여러 컨테이너를 연결 할 수 있다고 하는데, 물리적으로 다른 아이피에 있는 컨테이너도 하나의 도커 네트워크로 연결 할 수 있는건가요?이 예제를 학습해서 aws의 2개의 ec2에서 서비스를 분할하여 배포를 하고 싶은데, 이 네트워크 개념으로 가능한 일인지요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
통합테스트에서 H2 Member테이블에 정보추가 X
통합테스트 진행하고있는데회원가입이 오류없이 잘 작동합니다.하지만 MEMBER테이블에 가보면 아무런 정보가 추가되지 않았습니다.어디에 문제가 있는걸까요? 다시 실행해보니 중복회원이라고 뜨긴합니다ㅠ그래도 테이블에는 내용이 없습니다
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO 기본값 설정법
안녕하세요. 강의를 듣던 중 @RequestParam 의 defaultValue 값 설정 관련해서 궁금증이 생겨 질문남깁니다.강의에서는 offset, limit 값을 @RequestParam을 사용해 defaultValue 값을 설정할 수 있었는데, 만약 @ModelAttribute나 @RequestBody로 객체를 통해 값을 받는 상황에서는 어떻게 객체 내부 필드들에 defaultValue를 설정할 수 있을까요??
-
미해결[개념은 호옹~, 실습 빡] 스프링 부트, 입문!
인텔리제이에 firsproject를 불러오는데 뭔가 자꾸 오류가 뜨네요...
강의 그대로 다 따라했는데 어느 부분에서 이러는지 ㅁ르겠습니다...
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트코드에서 엔티티 set과 builder패턴 사용
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]안녕하세요 테스트코드 작성중 궁금한게 생겨 질문드립니다. @Setter 어노테이션을 자주 사용하게 되면 어디서 변경될지 모르기때문에 사용을 하지말라고 알고 있는데 김영한 강사님께서는 테스트 코드 작성시 set을 사용하셔서요 테스트코드에서만 setter를 사용한다면 문제가 없을까요? 이에 관련하여 구글링을 해보았는데 테스트코드 한정으로 setter를 사용한다고 하는 분들도 있네요 저 같은경우는 테스트코드에서도 @Builder 어노테이션을 통해서 set을 대체하고 있는데요 아무래도 좀 귀찮은면이 있어서... 엔티티에 @Setter를 선언하고 테스트 코드에만 사용하는것이 더 좋을지 그래도 @Setter의 위험성을 생각해서 사용하지말고, @Builder를 사용하는것이 더 좋을지 질문드립니다. 감사합니다.
-
미해결[개념은 호옹~, 실습 빡] 스프링 부트, 입문!
22강 에러 - org.springframework.dao.InvalidDataAccessApiUsageException
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 22강 테스트 중 아래와 같은 에러가 발생org.springframework.dao.InvalidDataAccessApiUsageException해결 → articleId 앞에 Param을 붙여줌.@Query(value = "SELECT * " + "FROM comment " + "WHERE article_id = :articleId", nativeQuery = true) List<Comment> findByArticleId(@Param("articleId") Long articleId);
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 database와 연결이 안 되는 것 같습니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]h2 database 설치 하여 console띄우고 jdbc url도 jdbc:h2:tcp://localhost/~/test 로 설정 후 Member 테이블 만들었습니다build.gradle에 필요한 라이브러리 추가 후 코끼리도 눌러주고application.properties에도 강의 내용과 똑같이 작성하였습니다. 그런데 여기가 뭔가 강사님께서 보여주시는 것과 다른 것 같습니다 글씨에 색깔도 다르고 무엇보다 spring이나 datasource 등을 쳤을 때 밑에 뜨는 것이 없습니다 무엇이 문제일까요? 다음은 제 코딩화면과 localhost:8080에서 회원 목록을 눌렀을 때 오류 화면 입니다.답변 부탁드립니다 감사합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberRepositoryTest / Testcase 작성 질문드립니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 테스트 코드 작성중에 의문사항 있어서 문의 드립니다. 1. MemoryMemberRepository(왼쪽사진)의 save method에서 return member를 해주고 있습니 다. save함수는 Map<Long,Member> store 변수에 값을 저장하는 method로 생각되는데, return을 하는 이유가 궁금합니다. findByName(오른쪽사진) method에서 repository.save(member1)는 Member member3 = repository.save(member1) 와 같이 Member member3을 선언을 안해도 되는것인지 문의드립니다. 감사합니다.
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
테스트 코드 작성할 때 이미 작성했던 코드 어떻게 나오게 해서 선택하시나요?
테스트 코드Assert.isTrue 작성할 때 이미 작성했던 코드가 나와서 선택만 해주시던데 어떻게 나오게 해서 선택하시나요? 플러그인이나 어떤 옵션이 있으신가요?
-
해결됨토비의 스프링 부트 - 이해와 원리
공부 방법에 대해서 질문드립니다.
안녕하세요. 토비님저는 이제 곧 4년차가 되가는 개발자 입니다.토비님의 스프링 부트 강의가 나온다는 이야기를 듣고 바로 구매 후 강의를 듣고 있는데 진짜 너무 좋은 내용에 무한 반복을 하고 있으며, 이전에 토비님이 쓰신 토비의 스프링 3.1을 이전에 완독을 해볼려고 하다가, 도중에 다른 일 때문에 중단을 했었는데 요번에 다시 한번 읽어볼려고 합니다.평소 토비님처럼 개발자로서, 전문가가 되고 싶다는 생각을 항상 하고 있는데, 토비님께서는 어떻게 스프링이나 다른 기술들을 공부를 하시는지, 궁금합니다. 그리고 토비님께서 생각하시는 스프링 개발자라면 꼭 기본적으로 꼭 알아야 될 필수 기술이 어떤 건지도 궁금합니다.어떻게 토비님께서 기술 공부를 하시는지, 비법을 알려주신다면 정말 열심히 해보겠습니다!정말 좋은 강의를 내주셔서 감사합니다.다음 강의 기다리고 있습니다!!ㅎㅎ
-
해결됨토비의 스프링 부트 - 이해와 원리
imports 파일을 읽어오지 못하는 오류
안녕하세요!이번에 스프링부트를 수강하게 된 학생입니다.퀄리티 높은 수업을 제공해주셔서 감사합니다!다름이 아니라 "자동 구성 정보 파일 분리" 파트를 수강하던 중imports 파일을 생성하여 class 정보를 불러오는 부분에서 오류가 발생하여 질문글 남깁니다.MyAutoConfigImportSelector.java에서 selectImports 메소드를 사용할 때리턴 해주는 String 배열을 직접 입력해주는 아래와 같은 방법을 사용하여 작성했을 때는 서버가 정상적으로 실행되었습니다.return new String[] { "tobyspring.config.autoconfig.DispatcherServletConfig", "tobyspring.config.autoconfig.TomcatWebServerConfig" };그런데 classLoader를 사용하여 META-INF 하위에 생성한 imports 파일을 읽어오는 코드를 작성하여 실행하니 ServletWebServerFactory 빈을 찾을 수 없다는 오류가 발생하며 서버가 정상적으로 실행되지 않습니다...혹시 META-INF를 읽어오지 못하는 이유가 있을까요??
-
해결됨실전! 스프링 데이터 JPA
findby findUserBy의 차이가 뭔지 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]JpaRepository 를 사용하던 중 findBy 와 findUserBy (find{Entity}By)가 있던데 이 둘의 차이가 궁금합니다. 둘 다 객체를 반환하던데 이 둘의 성능이나 보안적인 차이가 있을까요? 어떤 것을 사용하는 것이 좋은지 궁금합니다...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
setname이 안보이고 객체생성에 오류가 납니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]setname이 보이지않고 객체생성 옆에 오류가 납니다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
백엔드 뉴비입니다. 뷰도 만들고 싶은데 SSR말고 CSR 하는게 좋을까요?
백엔드 뉴비입니다. 뷰도 만들고 싶은데 SSR말고 CSR 하는게 좋을까요?혼자 프로젝트 연습중인데요! 타임리프보다는 Vue.js같은 걸 하는게나중에 협업할때 좋을 것 같아서요.이왕 공부하는거 타임리프보다Vue.js 공부할까요?정말 고민이에요..
-
미해결토비의 스프링 부트 - 이해와 원리
kotlin에서 registerBean 컴파일 에러 해결법
kotlin으로 toby님의 강의를 따라다가다 안되는 부분이 발생하여 다른분들도 해결하시면 좋을 것 같아 공유차원에서 글 남깁니다! org.springframwork.context.support.registerBean을 impot하여 해결할 수 있습니다.관련 docs:https://docs.spring.io/spring-framework/docs/5.0.0.RELEASE/spring-framework-reference/kotlin.html import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory import org.springframework.boot.web.server.WebServer import org.springframework.boot.web.servlet.ServletContextInitializer import org.springframework.context.support.GenericApplicationContext import org.springframework.context.support.registerBean import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus import org.springframework.http.MediaType import javax.servlet.http.HttpServlet import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse class HellobootApplication fun main(args: Array<String>) { val myApplicationContext = ApplicationContext() myApplicationContext.registerSpringBean() val serverFactory: TomcatServletWebServerFactory = TomcatServletWebServerFactory() val webServer: WebServer = serverFactory.getWebServer( ServletContextInitializer { it.addServlet("frontController", FrontController::class.java) .addMapping("/*") } ) webServer.start() } class ApplicationContext{ fun getContext() = springApplicationContext fun registerSpringBean(){ springApplicationContext.apply{ registerBean<HelloController>() refresh() } } companion object{ val springApplicationContext: GenericApplicationContext = GenericApplicationContext() } } class FrontController: HttpServlet() { override fun service(request: HttpServletRequest?, response: HttpServletResponse?) { requireNotNull(request) requireNotNull(response) val springApplicationContext = ApplicationContext().getContext() val helloController = springApplicationContext.getBean(HelloController::class.java) //인증, 보안, 다국어, 공통 기능 처리 duplicateCode() if(request.requestURI == "/hello" && request.method == HttpMethod.GET.name ){ val name = request.getParameter("name") response.status = HttpStatus.OK.value() response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) response.writer.println(helloController.hello(name)) }else { response.status = HttpStatus.NOT_FOUND.value() } } } private fun duplicateCode(){}