안녕하세요. 방학기간을 통해 스프링에 대해 공부하고 있는 대학생입니다. 다름이 아니라 스프링 핵심원리 강의에서 역할과 구현을 분리하라고 배웠습니다. 그래서 만약 '회원 저장소'를 만든다고 하면 pubic interface MemberRepository{ void save(Member member); Member findById(Long memberId); } 을 만들고 필요한 구현체를 따로 만들었습니다. 메모리를 이용한다면 public class MemoryMemberRepository implements MemberRepository { private static Map<Long, Member> store = new HashMap<>(); @Override public void save(Member member) { store.put(member.getId(), member); } @Override public Member findById(Long memberId) { return store.get(memberId); } } 이런 식으로 만들고, 만약 JPA를 이용한다면 public class MemberJpaRepository implements MemberRepository { @PersistenceContext private EntityManager em; public void save(Member member) { em.persist(member); } public Member findById(Long id) { Member member = em.find(Member.class, id); return member; } } 이런 식으로 만들어서 사용했습니다. 여기서 스프링데이터JPA를 사용하기 위해선 인터페이스에 JpaRepository를 상속받아야하는데 그러면 기존에 있던 MemberRepository에 상속받아서 사용하면 되나요? 그런데 MemberRepository에서 JpaRepository를 상속받게 되면 기존에 MemberRepository 구현체들이 JpaRepository까지 모두 구현해야하는 문제가 있고, MemberReposity에서 사용하는 메소드 이름과 JpaRepository에서 사용하는 메소드 이름이 같으면 MemberRepository를 주입받아 사용하는 다른 클래스에도 문제가 발생했습니다. 이래저래 글이 길었지만 그래서 어떻게 스프링데이터 JPA를 사용하면서 역할과 구현을 구분할 수 있을까요?
안녕하세요. 54강에서 실행중인 장고 컨테이너에 nginx를 붙였는데요. nginx를 붙였음에도 static 파일을 못가져 온 이유를 모르겠습니다. 여기서는 nginx와 django를 동기화하는 수단이 볼륨이고, 볼륨을 생성해서 도커 자체에서 제공한다는 개념인거같은데 nginx자체에서 static 파일들을 제공할 수 있어야 하는거 아닌가요?? 당장 안 된다면 그렇게 되도록 설정할 수 있는지 궁금합니다! 그리고 볼륨없이 nginx가 django에 요청을 통해서 static 파일들을 가져오지 못 하는지 궁금합니다.
안녕하세요. 강의를 듣던 중 궁금한 것이 생겨서 질문 드립니다! @Service @Transactional (readOnly = true ) 이 옵션을 Service 계층에만 붙이던데 사실 진짜 DB에 쿼리를 날리는 계층은 repository 계층인데 왜 Service 계층에 붙이는지 궁금합니다!
/news를 호출할 경우 아래와 같이 데이터를 두번 호출하게 된게 맞나요? 1. routes/index.js의 beforeEnter에서 'FETCH_LIST' 2. ListMixin.js의 create()에서 'FETCH_LIST' 제가 강의를 잘못 따라간건지, 강의를 따라가 보면 자연스럽게 /news는 fetch를 두번 하는건.... 헷갈리네요
안녕하세요, 선생님 초반에 transaction을 제거하고 성능을 높이는 방법을 보여주셨는데, transaction을 적용하기 이전의 코드와 1:52초 즈음에 알려주시는 코드의 차이가 궁금합니다. mongodb에서 직접 수정을 하냐 아니면 nodejs로 데이터를 가져와서 조작을 하냐의 차이 때문에 성공 실패가 갈리는거죠? 제 생각에는 아무래도 nodejs로 데이터를 가져온 상태에서 조작을 한다면, 조작해서 저장하는 시점엔 데이터베이스의 내용이 달라져서 덮어씌워지는 건데, 반대로 직접 데이터베이스에서 조작하면 항상 데이터베이스의 현재 내용물을 조작하니깐 일관성이 생기는거죠. 제가 잘 이해한게 맞을까요?
안녕하세요, 선생님. 공부하다가 궁금한게 생겨서 질문드립니다. transaction이 Atomicity를 유지할 수 있도록 abortTransaction을 쓰는 것 같은데, transaction의 에러 처리 부분에서 반드시 명시해줘야하는거죠? 혹시 {session}을 명시해준 mongoose api 중 하나라도 실패한다면 이전 것들이 자동으로 롤백되는 것이 아니라 abortTransaction을 명시해줘야 롤백되는건지 궁금합니다.
안녕하세요. 강의를 따라 가다가 안되는 부분이 있습니다. node server.js 하여 작동은 하나 Postman과 URL http://localhost:8080/products/2 접속시 로딩화면만 반복되며(postman도 동일 합니다.) 아래 사진과 같이 network 창 접속시 Status가 panding 상태로 나옵니다. 혹시 해결 방법이 있는지 문의 드립니다. 소스코드를 비교해봐도 차이점은 없었습니다.. 추가로 DB Browser에 두번 post 요청을 하여 값을 삭제한적은 있는데 이 행위가 오류를 발생 시키는 걸까요???
해답 소스코드를 보면 각 케이스의 출력 부분까지 for문 내에 들어가서 반복되는데요. 이 구조에서 입력을 수동으로 할 경우에는 첫번째 테스트 케이스 2줄을 입력한 후에 답이 출력되고, 다시 두번째 테스트 케이스 2줄을 입력한 후에 답이 출력되는 방식이 되지 않나요? 아래 사진처럼요. txt 파일을 import할 때는 출력 부분만 나오기 때문에 이런 차이가 발생한 것 같은데요. 수동으로 입력할 때에도 '테스트 케이스 한꺼번에 입력 -> 해답 한꺼번에 출력'해야 정답이라고 생각해서, 전역 변수로 빈 배열을 할당하고 출력 부분도 별도의 for문을 써서 구현했는데요. 이 경우 해답 코드보다는 효율성이 다소 떨어지는 것 같습니다. 실제 코딩 테스트 상황에서는 해답 소스코드 방식대로만 진행해도 괜찮은 것인지 궁금합니다. 다음은 제 코드입니다. 감사합니다! solution = [] t = int(input()) for i in range(t): n, s, e, k = map(int, input().split()) numbers = list(map(int, input().split())) solution.append(sorted(numbers[s-1:e])[k-1]) for i in range(t): print(f'#{i+1}', solution[i])