묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
mybatis도 ORM 기술인가요?
mybatis도 ORM 기술인데, ORM 기술 중에서도 SQL 매퍼이다. 라고 이해했는데 맞게 이해한 걸까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
싱글톤 패턴과 멀티 쓰레드의 관계 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]간단한 질문인 것 같은데, 제 머릿속이 헷갈려서 질문드립니다. 아마 싱글톤에 대한 이해가 부족한 것 같습니다. 클라이언트로부터 여러 요청이 들어 왔을 때 지연 대기를 최소화하고자 멀티 쓰레드를 사용한다고 이해했습니다.그런데 서블릿을 싱글톤으로 만든다는 건 '단 하나'의 객체만 만들어서 돌려 쓴다는 것인데, 만약에 100건의 요청이 동시에 특정 서블릿을 호출한다면 동시 처리가 안되지 않나요? 싱글톤 객체는 단 하나라서 하나의 쓰레드가 해당 객체를 사용할 때까지 99개의 쓰레드들은 해당 객체를 기다려야 하지 않을까요?그렇다면 멀티 쓰레드의 장점이 많이 사라지는 것 같은데, 제가 잘못 이해하고 있는지 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 최적화 테스트 중 트랜잭션에 관하여 질문
지금 주문 조회 최적화 테스트에서 @트랜잭션 어노테이션을 안붙히고 사용 중인데조회 최적화만 해서 안붙힌건가요? 만약에 insert 나 update 테스트를 했더라면 commit을 해줘야 하기 때문에 @트랙잭션을붙혀야 되는거죠.?
-
미해결스프링 시큐리티 OAuth2
keycloak 연동 (클라이언트 앱 시작하기 - application.yml)
아래 사진과 같이 yml 파일을 작성했는데, keycloak 로그인 폼이 적용이 안되고 기존 로그인 폼이 나옵니다.(프로그램 실행 시 기존처럼 비밀번호가 출력되고 해당 비밀번호로 id pw 입력하여 로그인하면 index 화면이 나오는 상황입니다.)keycloak과 연동 문제인 듯 한데, keycloak 인가서버 도메인과 관련되어있는 것 일까요?혹은, keycloak 연동을 위해 build.gradle 같은 곳에 추가 설정해 줘야 하는 부분이 있을 까요? 참고로 build.gradle은 아래 사진과 같고,종속성 'org.springframework.boot:spring-boot-starter-oauth2-client' 추가해 준 상태 입니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
내부적으로 orderProduct생기는 이유
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. [공지] 제가 9/27 ~ 10/9 약 2주간 해외 여행을 가게 되어, 해당 기간 동안은 질문에 대한 답변이 불가합니다. 🥲 질문을 남겨주시면 10/10 이후로 순차적으로 확인하고 빠르게 답변드릴 수 있도록 하겠습니다. 너른 양해 부탁드리며, 강의를 수강해주시는 분들 모두 항상 감사드리고, 또 응원합니다. 🙌🏻 다시 코드를 보니 헷갈리는게 있어서 질문 드립니다!OrderService에서 createOrder를 할때 내부적으로 중간 매핑 엔티티인 OrderProduct가 생기는 이유가 Order엔티티에 있는 create메서드를 호출 빌더로 Order객체를 생성할때 orderProducts리스트 초기화orderProducts는 casecade = CasecadeType.ALL이 되어있으므로 2번 과정으로 인하여 객체가 생성되고 db에 저장이 맞을까요? 감사합니다!
-
해결됨Practical Testing: 실용적인 테스트 가이드
Mock Test에 관련한 질문
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. [공지] 제가 9/27 ~ 10/9 약 2주간 해외 여행을 가게 되어, 해당 기간 동안은 질문에 대한 답변이 불가합니다. 🥲 질문을 남겨주시면 10/10 이후로 순차적으로 확인하고 빠르게 답변드릴 수 있도록 하겠습니다. 너른 양해 부탁드리며, 강의를 수강해주시는 분들 모두 항상 감사드리고, 또 응원합니다. 🙌🏻 안녕하세요 우빈님! 강의 수강 중 궁금한 점이 생겨서 질문드립니다!지금까지 작성한 테스트들은 Production Code가 제대로 동작하기 위해서 ~~했을때 이러한 결과가 나와야한다! 식의 검증을 제대로 한다는 느낌을 받았습니다. 그래서 후에 코드를 수정하고 테스트를 다시 돌려보며 로직이 제대로 실행하는지를 검증하며 테스트의 이점을 잘 활용할 수 있겠다라고 생각하였습니다. 하지만 Mock에 대해 학습을 하면서는 이 테스트가 효과적인 테스트인가? 하는 의문이 조금씩 들기 시작하였습니다.물론 지난 시간 학습하였던 OrderStatisticsService 의 경우 테스트의 주된 목적은 총 금액 확인이었으므로 sendEmail 메서드의 Stubbing은 왜 하는지 이해하였습니다. 이번 강의를 들으면서 몇가지 의문점이 생겼는데 다음과 같습니다!sendEmail을 Stubbing하면 당연히 반환되는 값은 Ture 일 것Mock객체의 defaultAnswer에 의해서 mailSendHistoryRepository.save()의 반환값이 null이어도 테스트가 성공함로직을 원하는대로 수행하기 위해 메서드가 몇번 호출되는지 검증을 할 필요가 있는가? 전체적으로 Stubbing을 얼마나 잘하는지에 대한 테스트를 한다는 느낌을 받았습니다!혹시 기능에 대한 사용법을 알려주시려고 한것인지 아니면 실무에서도 이러한 테스트를 작성하는지, 작성한다면 verify()를 사용할때 메서드 호출횟수를 검증하여 얻고자 하는것은 무엇인지, 그리고 모든 메서드를 Sutbbing하게 되면 해당 코드에서 무엇을 검증하는것인지 궁금합니다! 감사합니다!
-
해결됨스프링 부트 웹 개발 입문 - 따라하며 배우기
DB 생성시 발생 에러 관련! "Can't create table" "Error No 150. "Foreign key constraint is incorrectly formed")
선생님께서 올려주신 SQL 문 기준으로 확인해보니 하기와 같습니다.SQL 문에서 order_list 테이블에는 VARCHAR(100) 타입의 cust_id 열이 있으며, 이것은 cust_info 테이블의 cust_id 열을 참조하려고 합니다. 이 cust_id 열도 VARCHAR(100) 타입입니다. 따라서 데이터 유형이 일치하므로 이건 패스...그러나 외래 키에는 기본적인 규칙이 있고, 해당 규칙은: 참조하려는 열(상위 테이블의)은 고유 제약 조건을 가져야 하거나 기본 키여야 합니다. cust_info 테이블에서 cust_id 열은 고유 제약 조건이 없습니다.이 문제를 해결하려면 cust_info 테이블의 cust_id 열에 고유 제약 조건을 추가해야 합니다. 다음과 같이 할 수 있습니다:ALTER TABLE cust_info ADD UNIQUE (cust_id);위의 문장을 실행한 후 외래 키를 추가하기 위해 ALTER TABLE 문을 실행할 수 있습니다:ALTER TABLE order_list ADD CONSTRAINT fk_cust_id FOREIGN KEY (cust_id) REFERENCES cust_info(cust_id);이 단계를 거치면 해당 제약 조건에 대한 "Foreign key constraint is incorrectly formed" 오류를 더 이상 만나지 않아야 합니다. 즉 cust_info의 cust_id를 유니크 상태로 만들고 나서 늦부장님께서 올려주신 DB작성하면 해결 됩니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Hibernate5Module 관련 질문
Hibernate5Module 애가 빈으로 등록되어 있기 때문에아래 코드에서 프록시 객체인 상태를 getUsername()로 프록시 초기화 시켜 바로 api로 반환 가능한건가요? List<Order> all = orderRepository.findAllByCriteria(new OrderSearch()); for (Order order : all) { order.getMember().getUsername(); } return all; }
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan( basePackages = "hello.core", excludeFilters = @ ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { }package hello.core; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CoreApplication { public static void main(String[] args) { SpringApplication.run(CoreApplication.class, args); } }package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean //MemoryMemberRespository 객체로 초기화된 MemberServiceImpl 객체 반환 public MemberService memberService() { System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { System.out.println("call AppConfig.orderService"); return new OrderServiceImpl ( memberRepository(), discountPolicy() ); } @Bean public MemberRepository memberRepository() { System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } } ㅇCoreApplicaton 클래스(@SpringBootApplicaton)을 실행하면, @SpringBootApplicaton 에 @ComponentScan이포함되어 있기 때문에 CoreApplication 의 패키지 하위를전부 scan 합니다.그 과정에서 AppConfig 와 AutoAppConfig 를 만날텐데@ ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) AutoAppConfig에 @Configuration 은 스캔하지 말라고 되어있습니다. Q1. 그러면 AppConfig 는 스캔 되지 않고 빈으로 생성되지 않는 건가요?Q2. AutoAppConfig도 @Configuration이 등록되어있는데그렇다면 AutoAppConfig도 빈으로 생성되지 않는건가요?Q3. @Configuration public class AppConfig { @Bean //MemoryMemberRespository 객체로 초기화된 MemberServiceImpl 객체 반환 public MemberService memberService() { System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { System.out.println("call AppConfig.orderService"); return new OrderServiceImpl ( memberRepository(), discountPolicy() ); } @Bean public MemberRepository memberRepository() { System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } }AppConfig 를 컴포넌트 스캔 대상에서 제외해버리면 AppConfig의 수동 빈 등록 내용도 전부 무시되어 얘네들이빈으로 생성되지 않는건가요? Q4.CoreApplicaotn 에도 @Configuration 이,AutoAppConfig에도 @Configuration이 설정되어있는데이 경우 충돌이 일어나지는 않나요? Q5.만약 Q4에서 충돌이 일어나지 않는다면, 두개의 Configuraiton 내용이 둘다 프로젝트에 적용되는 건가요?
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
int i = menuService.doInsert(coffee,kind,price); 이 코드 질문있어요
혹시 변수타입이 왜 int인지 알 수 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
No active profile set
이런식으로 실행이 안되는 모습을 보입니다.세팅에서 이렇게 둘다 IntelliJ로 설정해주고 Download external Annotations 도 켜놨는데 저런 상황이네요 ㅠㅡㅠ 어떻게 해야할지 모르겠습니다...
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
섹션1 JPA와 DB설정, 동작확인 강의에서 Test를 통과했는데 Member 테이블이 생성되지않았습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요.현재 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의'에서 'JPA와 DB 설정, 동작확인' 강의를 듣고 있습니다.H2 데이터베이스에 연결하고, 테스트 코드를 실행해서 통과했다고 나옵니다. 그런데 강의 영상처럼 create table, drop table 등의 메시지가 터미널에 나오기는 하는데 제대로 된 건지 잘 모르겠습니다. 그리고 가장 큰 문제는 H2 데이터베이스에 Member 테이블이 생성되지 않았습니다.아래 코드와 스크린샷을 첨부합니다.제가 한 부분 중 잘못된 부분이 있는 건지 궁금합니다.그리고 어떻게 하면 해결할 수 있는지 궁금합니다. Memberpackage jpabook.jpashop; import lombok.Getter; import lombok.Setter; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; } MemberRepositorypackage jpabook.jpashop; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Repository public class MemberRepository { @PersistenceContext private EntityManager em; public Long save(Member member) { em.persist(member); return member.getId(); } public Member find(Long id) { return em.find(Member.class, id); } } application.ymlspring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug org.hibernate.type: trace #스프링 부트 2.x, hibernate5 org.hibernate.orm.jdbc.bind: trace #스프링 부트 3.x, hibernate6 MemberRepositoryTestpackage jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception { //given Member member = new Member(); member.setUsername("memberA"); //when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } } 테스트 결과의 일부분 스크린샷 이 상태로 H2에 접속했습니다.테스트 후 H2 데이터베이스의 스크린샷 위의 스크린샷처럼 테스트를 실행하면 통과로 나오기는 합니다.그렇지만 강의 영상처럼 create table, drop table이라고 되어있는 부분이 있지만 제대로 된 건지 모르겠습니다.그리고 테스트 후 H2 데이터베이스를 보면 Member가 생성되지 않았습니다.(가장 큰 문제)제 코드나 제가 실행한 부분 중에서 잘못된 부분이 있는지 궁금합니다.그리고 해결 방법도 궁금합니다.감사합니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
vscode에서 profile 인식문제 해결방법 공유합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의와 같은 방법으로 설정하여도 intelliJ와는 달리 vscode에서 test/resources/application.properties 안의 spring.profiles.active를 못 인식하는 문제가 있습니다.이거때문에 너무 고통 받아 해결방법을 공유합니다. main/resources 안에 application-dev.properties와 application-test.properties를 생성합니다.main/resources/application.properties의 내용 중 spring.profiles.active 줄을 제외한 나머지를 -dev에 복붙합니다.test/resources/application.properties의 내용 역시 위와 같은 방법으로 spring.profiles.active 줄을 제외한 나머지를 -test에 복붙합니다.main/resources/application.properties 안 모든 내용을 삭제하고 spring.profiles.active=dev 만 작성합니다.junit 테스트 중인 클래스 위에 @ActiveProfiles("test")를 추가합니다.추가로 vscode에서 test 설정은 앞으로 -test에서 하시면 됩니다.
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
com.mysql
43강 4분 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId> </dependency> 저는 이부분에 처음부터 이렇게 뜨는데 왜그런걸까요?
-
미해결스프링 핵심 원리 - 기본편
DiscountPolicy를 호출할 때 왜 인터페이스를 호출하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] RateDIscountPolicy로만 불러오는게 아니라 왜private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); 처럼 인터페이스로부터 불러 오나요?인터페이스는 구현체를 만들때에만 쓰이는게 아닌가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
도메인 이름
강의에서 이세계의 집 주소 별칭을 현실 세계의 도메인으로 빗대어 설명해 주신 부분에 대한 질문입니다.1. 강의를 들을 때 '서울에 있는 컴퓨터' == 강의를 듣고 있는 내 노트북, '대전에 있는 컴퓨터' == 인프런 사이트의 서버 쯤으로 이해하는 게 맞을까요?처음에는 간단하게 친구 컴퓨터와 내 컴퓨터 사이의 카카오톡으로 데이터를 주고 받는 상황 으로 이해 헀는데, '대전에 있는 컴퓨터'의 주소에 도메인 이름이 붙는 걸 보니 이해가 안 가더라구요. 내 컴퓨터에 spring.com 이라는 주소 이름이 붙을리가 없으니까요.친구 컴퓨터와 내 컴퓨터 사이의 카카오톡 통신은 '친구 노트북와 카카오 서버와의 통신' + '카카오 서버와 내 노트북의 통신' 으로 나뉜다고 이해하는 게 맞을까요? 만약 위에서 카카오톡을 예시로 든 내용이 맞는 내용이라면 추가로 더 궁금한 게 있습니다.채팅 어플에선 어떤 HTTP Method를 사용하나요? 내가 친구에게 카톡을 보낸다면 POST 같은 메소드를 쓸 수 있을 것 같긴한데, 그건 내가 '보내기' 버튼을 이용해서 카카오 서버에 요청하는 것으로 생각해봤습니다. 그런데 친구에게서 오는 카톡은 어떻게 나에게 오는 건지는 도무지 생각이 나질 않습니다. 내 컴퓨터에서 카톡 서버에 실시간으로 계속해서 GET과 같은 메소드로 요청을 하는 것은 아닌 것 같아서요. 카카오와 같은 서버가 내 컴퓨터로 요청하는 경우가 있다면, 내 컴퓨터는 따로 도메인 주소를 갖고 있지 않으니 그냥 내 컴퓨터 IP를 사용하나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Controller와 Service간의 requestDto를 구분하는 측면
충분히 공감가고 이해되는 내용입니다! 좋은 내용 설명해주셔서 감사합니다!그렇다면 responseDto도 순수 서비스 응답과 ,각 컨트롤러 별 응답으로 구분하는게 좋을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
springmvc/old-controller
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 똑같은 코드인데 어떤 컴퓨터에서는 되고 다른 컴퓨터에서는 안되는 이유가 뭔지 궁금합니다. https://drive.google.com/file/d/11Zuk3zBvm9QWWpyIQeAWwWIwUGdSc7Bk/view?usp=sharing 이게 제 코드인데 강사님 코드를 다운 받고 돌려도 localhost:8080/index.html 조차 에러가 뜹니다. 뭐가 문제일까요. 저번에 질문했지만 문제가 해결이 되지 않아 한번 더 질문합니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요@RequestBody와 @ModelAttibute차이를 제대로 이해했는지 궁금하여 여쭤봅니다.서버로 데이터를 전달하는 방법은 3가지방법이있는데 쿼리파라미터 시에는 get방식 @RequestParam 사용HTML Form 시에는 get, post 다 지원 @ModelAttibute 사용message body 시에는post방식 @ReqeustBody 로 받아서 사용하는것이 맞을까요?각 전달 방법3가지에 get/post방식 매핑과 어노테이션 매칭이 잘 되엇는지 궁금합니다. 그리고 RequestParam , ReqeustBody 를 컨트롤러의 같은 메소드에 사용가능할까요?ex ) public void test(@RequestParam int id, @ReqeustBody Body body)같이 사용가능하다면 왜 가능한지도궁금합니다ㅜㅜ
-
미해결Java/Spring 주니어 개발자를 위한 오답노트
@Entity != RDB Table에 대한 질문입니다.
예전에 조영호님의 '오브젝트' 서적을 읽고 "어떻게 비즈니스 모델을 더 변경에 부드럽게 설계할 수 있을까?"에 고민을 했습니다. 그때의 기억으로는 "역할은 책임을 위한 최소한의 정보만 가지고 있자"라고 제가 이해를 했고 @Entity가 달린 class를 "역할"로 보고 코드 작성을 하니 1개의 RDB Table이 2개 이상의 Entity Class로 매핑이 되었습니다.평소에 1개 Entity Class가 1개 Table와 매핑하는 것과 달라 괴리감이 들었습니다. 핵사고날 아키텍쳐를 적용하면 비즈니스 모델과 JPA의 Entity를 분리할 수 있지만 팀원들과의 합의도 필요해서 적용할 수 없었고 주니어라 해당 기술 도입으로 생산성이 올라갈 것이라고 장담할 수도 없었습니다. 두서가 없이 말이 많았는데 궁금한 점은!"RDB의 1개 Table을 2개 이상의 Entity로 매핑해서 운영을 하는게 보편적인 방식인가요?" 입니다. ++ 개인적인 질문입니다만 객체의 협력 관계를 먼저 설계하는 것과 DB 설계하는 것 어떤 것이 우선인가요?