mvc패턴과 restapi 개념은 알고 있습니다. mvc패턴은 기존 정적 컨텐츠(템플릿을 사용하지 않은 html파일)을 템플릿엔진이라는 것을 사용하여 요구 사항이 있을 때마다 html파일을 새로 만들 필요없이 {{}}문법을 사용하여 재사용성이 높아진 html파일을 응답으로 보내주게 되는 것이고 restapi는 응답 형태가 html(정적 컨텐츠 혹은 mvc)을 보내주는것이 아닌 json형태의 객체를 요청한 곳에 응답해주게 되며 기존 웹을 대신하여 서버나 모바일 등에도 통신이 가능하게 끔 하는 방식이라는 것을 알았습니다. 제가 궁금한것은 백엔드 개발을 하는 쪽에서 요즘 같이 프론트엔드의 기술이 발달한 세상에서 html을 템플릿 엔진을 사용해서 보내주어야 하는것이 의문점입니다. 보통 프론트엔드 개발이 사용자가 이용할 웹페이지 등을 개발하고 백엔드 개발이 데이터베이스를 거쳐야 하는 작업(로그인 등)을 처리하는 로직을 개발하는 것으로 알고 있었는데 백엔드 쪽 프레임워크인 스프링에서 약간 풀스택 느낌으로 해버리는 느낌이 없지 않아 있어서 이런 질문을 드립니다. 결론적으로 백엔드 개발 쪽에서는 restapi가 많이 쓰여질거 같은데 실무 쪽에서는 어떻게 사용되는지 궁금합니다!
안녕하세요! 항상 강의 잘 듣고있습니다. User.findOne.mockReturnValue(Promise.resolve({ addFollowing(id){ return(Promise.resolve(true); } 이 부분에서 프로미스를 반환해주어야지만 밑에 부분인 await addFollowing함수가 실행된다고 책에 나와있는데요, 그렇다면 사용자를 못찾았을때에는 null값을 반환한다고 했는데, 프로미스를 반환하지 않아도 await addFollowing함수가 실행이 되는것 아닌가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 예시로 username이 test, id가 1234인 유저를 조회한다고 가정했을 때 저는 그동안 JSON 형태로 { "username" : "test", "id" : "1234 } 이렇게 GET 요청을 했었는데 (포스트맨에서 request.body의 값으로 읽어올 수 있도록), 이런 경우도 "메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음" 의 예시에 포함되나요? 만약 그렇다면, 이렇게 조회하는 방식을 POST 요청으로 보내야 하는지, 아니면 GET으로 요청하되 요청하는 방식을 URL에 쿼리 파라미터를 통해서 전달해야만 하는 것인지 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 제가 jdk17을 사용하여 spring을 실행하는데 OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. 이라는 에러(경고)가 나옵니다 경고만 나올뿐 스프링 자체는 정상적으로 실행되지만 불안하여 질문 남겼습니다 또한 제가 원래 1.8환경에서 작업하던 프로젝트는 gradle을 수정하여 17로 수정하면 계속 사용할수 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 위와같은 에러가 발생합니다. 에러 문구에 17버전 이라고 되어있어 구글링을 통하여 java버전이 제대로 설정되어있지 않음을 파악하고 환경변수 설정을 해주었습니다. 그래도 저 에러가 해결되지않아서 질문드립니다.
"장고 기본 CBV API (Generic editing views)" 강의를 들으면서 ProcessFormView의 소스 코드를 보던 중 get 매쏘드에 render_to_response, get_context_data 매쏘드가 사용된 것을 보았습니다. 그런데 ProcessFormView와 이것의 부모인 View class에는 render_to_response, get_context_data가 정의 되어있지 않습니다. 그렇다면 도대체 이 함수들의 출처는 어디일까요? 제가 계속 고민을 해보고 한번 추측을 해봤는데 제가 추측하기로는 ProcessFormView는 단독을 쓰이지 않고 무조건 어떤 class의 부모로서만 역할을 하고 또한 ProcessFormView를 상속받는 class에 render_to_response, get_context_data가 정의가 되어있다면 문제는 없을 것 같습니다. 제 추측이 맞나요?
안녕하세요? JPA 공부중 질문 드립니다. OrderItem에관해 생각중인데 해결이 안되는 문제가 있어서 질문을 드립니다. 직접적인 강의내용에는 약간 벗어날수도 있지만 도와주시면 정말 감사하겠습니다. 상황을 한번 가정해 보면 Order(주문)이 한개 존재하고 거기에 딸린 Item이 아주 많다는 상황을 가정해볼게요 그리고 저는 특정 Order 에 특정 Item 이 존재하는지 확인하고 싶습니다 . 1. 가장 먼저 생각나는 단순한 방법은 Order Entity가 다음처럼 orderItems로 갖고있으니 @OneToMany(mappedBy = "order", cascade = ALL ) private List<OrderItem> orderItems = new ArrayList<>(); for문을 돌면서 하나하나 돌면서 원하는 Item의 ID가 존재하는지 확인해볼수 있을 것 같습니다. 이건 아마 O(n)인것같은데 orderItem이 아주 많다면 별로 좋은방법은 아닌것같습니다. 2. 다음 생각은 Set을 이용하는 방법일것같은데, 그렇다면 Item을 다음처럼 Id만 존재하는 Set을 만들어야 하는게 맞나요? Set<Long> orderItems ; 근데 Entity에서는 Set<OrderItem> 이런식으로 아마 갖고있어야 할것 같은데 아이디만 갖는 Set<Long>을 만들어야되는데 O(1)이 가능한지 잘 모르겠습니다. 그리고 Set<Long>이 만들어 지더라도 많은 양을 메모리에 다 담아둔다는게 좋은방법인지 모르겠습니다. (+ equals 구현으로 Set<Long>을 굳이 만들필요는 없을수도 있을것같네요 그래도 메모리에는 담아야될것같긴합니다..) 3. 다음 생각은 Item이 있는지 JPQL이나 QueryDSL이던 쿼리를 하나 새로 생성해서 mapping이 존재하는지 카운트하는 방법이 있을것같은데 이렇게하면 디비를 한번더 갔다와야되고, Order의 리스트 조회시에는 매 건마다 쿼리를 한번씩 하는 문제가 생길것같습니다. 한번이 문제가 그다지 안될수도 있지만 아이템처럼 매핑된 다른 엔티티가 여러개 존재한다면 리스트 조회시 건마다 쿼리하는게 늘어날것 같습니다. 이런경우에는 어떻게 해결할 수 있을까요? 감사합니다.
책 388쪽 날짜 예제를 보면 m.createDate = {d '2012-03-24'}로 DATE타입을 명시하면 된다고 나와있는데 List < Member > resultList = em. createQuery ( " SELECT m " + " FROM Member m " + " WHERE m.birth > {d'2000-01-1'} " , Member . class ) . getResultList () ; 이러한 코드를 작성하고 코드를 돌리니까 java.lang.IllegalArgumentException: org.hibernate.QueryException: unexpected char: '{' [SELECT m FROM JPA.QueryPractice.domain.Member m WHERE m.birth > {d'2000-01-1'}] 이러한 오류가 발생하였고 이 오류에서는 "{"라는 문자를 인식할 수 없다고 나오는데 그러면 어떻게 날짜 타입을 작성해야 하는건가요?? List < Member > resultList = em. createQuery ( " SELECT m " + " FROM Member m " + " WHERE m.birth > '2000-01-01' " , Member . class ) . getResultList () ; 이 코드는 정상적으로 실행됩니다
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
opertor를 공부하면서 생성자 부분이 궁금해서 테스트를 해보았는데 class Player { public : int m_iHp; int m_iAttack; int m_iDefense; public: Player() : m_iHp(100), m_iAttack(20), m_iDefense(5) { cout << "Player 기본 생성자!" << endl; } Player(int id) : m_iHp(200), m_iAttack(40), m_iDefense(10) { cout << "Player ID 받는 버젼 생성자!" << endl; } ~Player() { cout << "Player 소멸자!" << endl; } }; class Knight : public Player { public: int m_iStat; public: Knight() : m_iStat(10) { cout << "Knight 기본 생성자!" << endl; } Knight(int id) : Player(id), m_iStat(20) { cout << "Knight id 받는 버젼 생성자!" << endl; } ~Knight() { cout << "Knight 소멸자!" << endl; } }; int main() { Knight k1; k1 = 3; return 0; } 현재 Knight k1을 만들게 되면은 콘솔창에 출력문이 이렇게 찍혀 햇갈리는 부분이 있어서 질문드립니다. 메모리를 확인해보니 k1의 주소(0x000000718D0FF688)는 이런값으로 안에 데이터들이 스택에 자리를 차지하게되어있었습니다. 이후 k1 = 3; 를 하게되면 Knight k1의 스택에 있는 주소가 가르키는 값들이 변경이 되는데 이는, 타입 변환 생성자(기타 생성자)를 통해 만들어진 객체를 만들어서 "암시적 형변환"으로 만들어진 객체를 대입연산자로 k1의 주소에 멤버 변수 하나하나를 다 덮어 쓴 형태인거같더라구요 즉, 정리하자면 1) Knight k1; 을 하는 순간은 스택에 기본 생성자를 호출 한 상태로 올라간다. 2) k1 = 3 하였을 경우, 컴파일러가 암시적 형변환으로 인자를 하나를 받는 Knight의 타입 변환 생성자(기타 생성자)를 호출한뒤 k1의 주소에 '=' 연산자를 통해 멤버 변수 하나하나를 덮어쓴다. (얕은 복사) 여기서 궁금한점이 소멸자를 출력하는 문장이 두줄에 걸쳐서 나오는게 아니라 이런식으로 4줄에 걸쳐서 나오는데 이게 분명히 암시적 형변환으로 생성한 객체를 생성하고 기본생성자로 만든 k1에 멤버 변수들을 덮어썻다고 생각해서 스택에는 Knight의 객체가 하나밖에 없는 상태로 봤는데 콘솔창을 확인하면 k1뿐만 아니라 k1 = 3을 하였을 때의 3에 해당하는 객체도 어딘가에 존재를 하는거 같은데 3이라는 정수를 컴파일러가 타입변환 생성자로 받아들여서 인자를 하나만 받는 Knight객체를 만들어서 '=' 연산자를 통해 k1에다가 멤버 변수를 다 덮어 씌우는데 정수 3을통해서 만들어진 객체도 스택에 올라간 다음에 값만 k1이라는 객체에 덮어 씌우는건가요..?? 맞는말인가요..???
1. 새로운 http요청이 들어오면 컨테이너가 새로운 httpservletrequest객체를 생성한다고 알고 있습니다. 그런데 FrontControllerServletV4 클래스 service 메소드 내부에 System.out.println("request: "+request.hashCode());를 삽입하고 회원 가입,회원 목록을 클릭하면 동일한 해시코드가 생성된다고 나오는데 회원 가입, 요청은 다른 http요청인데 이유가 무엇인가요? 2. 서블릿 객체는 컨테이너에 의해서 싱글톤으로 관리 된다고 배웠습니다. 그러면 FrontControllerServletV4 클래스 service 메소드 내부에서 생성해 주는 Map<String, Object> model = new HashMap<>(); 같은 model 객체들은 새로운 http요청이 들어올때마다 새로 생성되는 것인가요? 아니면 FrontControllerServletV4 객체가 싱글톤인것 처럼 싱클톤인가요?
webapp 디렉토리의 index.html과 basic.html이 열리지 않습니다.... 인텔리제이 유료버전을 사용하고 있고 build를 인텔리제이로 바꿔도 봤고, build.gradle에서 tomcat 부분을 주석으로도 해봤는데 모두 출력이 정상적으로 이루어지지 않습니다...오타가 있나 봤는데 오타도 없고, 지웠다가 다시 생성해봐도 동일합니다....ㅠㅠ
데이터 요청시에 access token 이 만료되면 axios 인터셉터가 가로채서 재요청 하는 부분에서 궁금한 점이 있습니다. 그런데 만약 한 컴포넌트 (페이지) 에서 서버 요청이 두번 들어 갈때 ex) useEffect(() => { axios ("/foo") ... }, []) useEffect(() => { axios ("/baa") ... }, []) 이상황에서는 토큰 발급을 두번 발생시켜서 서버 리소스가 낭비되는거 아닌가요? 혹시 위와같은 상황일때 access 토큰 만료시 한번만 발급하고 나머지 서버 요청값은 취소 후 발급완료후 취소된 나머지 요청을 재 실행 할 수 있는지 궁금합니다.