묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
clearStore cannot find symbol
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.코드를 정상적으로 작성했음에도 불구하고 오류가 납니다. file-invalidate caches 후 다시 실행하여도 같은 오류가 발생됩니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
[스프링 MVC2편 : 스프링 인터셉터 - 요청 로그 ]강의에서 2분 10초쯤에 uuid 관련해서 궁금한 점이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]uuid를 prehandle()에서 aftercompletion() 로 넘겨주기 위해서 LogInterceptor 클래스 안이면서, prehandle()와aftercompletion() 밖에다 선언해주면 안된다고 하셨는데, 그 이유가 혹시 싱글턴으로 인터셉터를 관리하는데, 한개의 인스턴스를 공유해서 쓰므로, 트랜잭션 끼리 uuid가 겹치는 문제가 발생하기 때문인가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MVC1, MVC2, Front Controller의 이론적 구분이 궁금합니다.
안녕하세요. 강의 잘 듣고 있습니다.제가 이전에 JSP 강의를 다른 곳에서 수강한 적이 있었는데, 그때 배운 MVC의 이론적 내용을 확인하고 싶어서 질문 드립니다. MVC model 1은 JSP가 Controller와 View의 역할을 모두 수행한다는 특징이 있습니다. MVC model 2는 Controller와 View를 분리하고, Front Controller를 두어서 공통 처리를 수행한다는 특징이 있습니다. 위의 2가지가 제가 배운 내용을 요약한 것인데요.그렇다면 Front Controller를 도입한다면 MVC2에 해당한다고 확실하게 말할 수 있을까요?인터넷에서 검색했을 때는 MVC model 2에 Front Controller를 도입하지 않고, 모두 개별 Controller를 사용하는 것처럼 이야기하는 블로그가 많아서 확실하게 하고자 질문을 드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
필터 제한의 장점에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]- 필터 제한에서 필터에서 적절하지 않은 요청이라고 판단하면, 거기에서 끝을 낼 수 있다고 하셨는데, 이로 인한 장점이 서버 부하를 줄일 수 있는 걸로 이해해도 괜찮을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
필터 유즈케이스 관련해서 질문있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]- 강의 7분 정도에서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하라고 하셨는데, 위 요구사항의 예시로, 1개의 url 요청을 어떤 클라이언트가 1초에 수십번 요청하는 걸 감지하는 경우로 생각해도 괜찮을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult typemismatch, ExceptionResolver TypeMismatchException
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]BindingResult에서 처리된 typemismatch와 ExceptionResolver강의에서 처리하는 TypeMismatchException의차이가 궁금해요.
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
pageStart 생성시점이 궁금합니다.
BoardMapper.xml의 pageStart가 어디서 생성이 되는지 헷갈려서요 ㅠㅠ...Criteria.java에서 getPageStart()로 만들어준것 같은데.통상 VO에서 getter setter를 만들때 private int pageStart; <-- 이런식으로 선언하고 아래에서 getter, setter를 만들어주는데 여기서는 지금 바로 getPageStart만 만들어주고 있는것 같습니다.근데도 pageStart라는 변수에 값이 들어가는것 같은데 lombok.Data에 의해서 getPageStart()가 자동으로 pageStart를 만들어주는것인가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ModelAndView 파라미터
강의 수강중 제가 이해한것이 맞는지 궁금해 질문드립니다..여러 컨트롤러에서 Model 이나 ModelAndView를 생성하지 않아도 되게끔 프론트 컨트롤러 (Dispatcher servlet) 에서 비어있는 Model 이나 ModelAndView를 생성해서컨트롤러의 파라미터로 사용 할수 있게 하는것 이라고 이해했는데 맞는건가요..??
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
LoginController - loginV3() 에서 response객체에 쿠키를 안 담는데요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]p29 에 보시면createSession()이 있는데 여기선, 세션에 저장 + response에 쿠키담기 가 이루어 지는데요p35에는 session.setAttribute()로 객체에 값을 저장만하는데요. response에는 쿠키 담기 행위가 없는데요. 그래서 혹시 질문 게시판을 훑어서 찾아봤는데 https://www.inflearn.com/questions/586796/httpsession-setattribute-%EA%B0%80-response%EC%97%90-jsessionid-%EA%B0%92%EC%9D%84-%EC%A0%84%EB%8B%AC%ED%95%B4%EC%A3%BC%EB%8A%94-%EC%97%AD%ED%95%A0%EB%8F%84-%ED%95%98%EB%82%98%EC%9A%94를 봤는데도 제가 이해가 안가더라구요.서버에서 클라이언트로 먼저 쿠키를 보내줘야 하는데, response에 담는 행위가 없어요.response에 담는걸 톰캣이 해준다는 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.스프링부트 3.0 와 java 17을 사용하였습니다. cmd에서 gradlew를 실행하자다음과 같은 오류가 계속 뜹니다. A problem occurred configuring root project 'hello-spring'.> Could not resolve all files for configuration ':classpath'.> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.6.Required by:project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.6> No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.6 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6.1' but:- Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 8)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.6 declares a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.6 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 8)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') setting 과 project structure 에서 모두 17로 설정했는데도 같은 오류가 반복됩니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원 리포지토리 테스크 케이스 findByName NoValue 에러 관련 질문입니다
package repository; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.*; class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @AfterEach public void afterEach() { repository.clearStore(); } @Test public void save() { //given Member member = new Member(); member.setName("spring"); //when repository.save(member); //then Member result = repository.findById(member.getId()).get(); assertThat(result).isEqualTo(member); } @Test public void findByName() { //given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); //when Member result = repository.findByName("spring1").get(); assertThat(result).isEqualTo(member1); //then } @Test public void findAll() { //given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); //when List<Member> result = repository.findAll(); //then assertThat(result.size()).isEqualTo(2); } } package hello.hellospring.repository; import hello.hellospring.domain.Member; import java.util.List; import java.util.Optional; public interface MemberRepository { Member save(Member member); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); }package hello.hellospring.repository; import hello.hellospring.domain.Member; import java.util.*; public class MemoryMemberRepository implements MemberRepository { private static Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } public void clearStore() { store.clear(); } }이렇게 오류가 발생하는데 이유가 뭘까요? 아래와 같이 코드를 수정해보기도 하였습니다만, findAll 과 같이 노란색이 될뿐 초록색 마크가 나오지는 않습니다.@Test public void findByName() { // given Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); // when Optional<Member> result = repository.findByName("spring1"); // then assertThat(result.isPresent()).isTrue(); assertThat(result.get()).isEqualTo(member1); }
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSP 회원 전체 조회가 안되네요.
질문 내용]여기에 질문 내용을 남겨주세요. 일단 두 사진 보시면, 예외 처리를 해주면 예외 처리가 try 내부 코드가 예외를 안던지니까 catch 빼라고 하고,예외 처리를 안해주면, IOException이 예외처리가 안됐다고 하네요..뭐가 문제죠..?람다를 사용했다고 해서 안될리가 없어보이는데 ㅠㅠ 추가로 out.write();가 Writer 추상 클래스의 write(); 메서드고 checked예외를 던지던데, try-catch로 안잡아줘도 되는 이유가 뭔가요??
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
postman 응답 결과에 대한 질문입니다.
안녕하세요!선생님 강의를 재밌고 유익하게 수강하고 있는 학생입니다.스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의의 bean validation - HTTP 메시지 컨버터 부분을 수강하던 중 강의 내용과 제 결과 케이스의 다른 부분이 있어 다른 결과가 나오게 된 원인이 궁금하여 질문 드립니다!강의와 결과가 달랐던 부분은 postman으로 실패 요청을 send했을 때의 응답 결과 입니다.강의의 결과입니다.{ "timestamp": "2021-04-20T00:00:00.000+00:00", "status": 400, "error": "Bad Request", "message": "", "path": "/validation/api/items/add" }제가 실행한 결과입니다.{ "timestamp": "2021-04-20T00:00:00.000+00:00", "status": 400, "error": "Bad Request", "path": "/validation/api/items/add" }보이는 바와 같이, 제가 실행한 결과에서는 message에 대한 json 객체가 존재하지 않습니다. 혹시 스프링 부트의 버전과 관련된 부분에 있어서 차이가 있을까요?현재 사용 중인 스프링 부트 버전은 2.7.11 버전입니다.
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
logback-spring.xml 을 그대로 구현해봤는데요
저는 로그가 하나도 안찍히고 그냥 재생만 되네요.그리고 디버깅 버튼을 눌러도 저런식으로 로그가 아예 안나와요. 혹시 다른 추가적인 부분을 건드려야하나요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
SessionConst
교재 6.로그인처리1 p 35 보면SessionConst가 있는데요 이거 enum으론 하면 안될까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서버에 파일업로드할 때는 어떻게하나요?
로컬에서 파일 업로드를 구현할 때는 강의때 해준 방법 처럼 file.dir변수에 C:/test_img/ 이런식으로 변수를 지정하고 저장을 하였는데 이번에 cafe24를 사용해서 프로젝트를 배포하는 작업중인데 어떻게 경로를 설정해야할 지 모르겠어서 질문드립니다ㅠㅠ cafe24에 문의 해보았는데 server.xml 파일에서 해당 경로를 매핑 해줘야 한다고 하였습니다.<Context docBase ="서버의 업로드 폴더 경로" path="localhost 뒤에 붙을 업로드 폴더의 경로" reloadable="true"/>https://yn971106.tistory.com/104?category=1016466https://kang0312.tistory.com/95https://tibang.tistory.com/entry/%EC%82%AC%EC%A7%84%EA%B0%99%EC%9D%80-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C%EC%8B%9C-%EA%B2%BD%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95tomcat-%EA%B8%B0%EC%A4%80아래 블로그를 참고하라고 하긴하던데 매핑하는 방법만 알려주고, 파일업 업로드하는 로직은 없고, 구글링을 해봐도 강사님께서 알려주신 파일 업로드 로직과는 다른 글들 뿐이여서 파일 업로드 로직을 다 뜯어 고쳐야 하는건가.... 고민입니다.혹시 file.dir값만 딱 수정해서 서버에서 파일 업로드 할 수 있는 방법 아시면 알려주시면 감사하겠습니다.... 참고로 cafe24서버에 올린 폴더 경로입니다 upload폴더는 제가 생성한거고 권한도 777로 주었습니다.file.dir=/tomcat/webapps/upload/위와같이 경로 값을 주었는데 잘 작동하지 않습니다ㅠㅠ +추가강사님이 알려주신 file.dir을 통해 파일 경로를 지정하는 방법은 spring boot에서 톰캣서버를 내장하고 있어서 가능한건가요?? cafe24에 배포할 때는 서버를 내장하지 않으므로 server.xml에 <Context docBase="D:\IMAGES" path="/IMAGES" reloadable="false"/> 이거를 추가해야하는 건가요?? 서버쪽 영역으로 가니까 아직 모르는게 많네요ㅠㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 타임아웃 설정이 안됩니다.
안녕하세요.로그인 처리1 마지막 부분 세션 타임아웃 설정부분.pdf 41page가 안됩니다.application.properties 파일에서server.servlet.session.timeout=10이렇게 해보기도 하고SessionInfoController에서session.setMaxInactiveInterval(10);이렇게 해보아도 타임아웃이 되지 않습니다.제가 기대하는 것은 10초 뒤에는 세션아웃이 되어서 로그인이 필요한 페이지에 접근이 않되는 것인데요.제가 잘못이해하거나 설정이 안된 부분이 있다면 알려주시면 감사하겠습니다.제가 작성한 프로젝트는 여기에 올렸습니다.https://drive.google.com/file/d/1q1VbFHc21BpUgeTIjCvCd5WmXW-abwHm/view?usp=share_link
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
JSP 로 보여지지 않아요
JSP 형식으로 보여지지 않아요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
체크박스-단일2 3분 56초(체크박스 등록 폼 중에서 의문점).
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]상품등록폼 addForm.html 의 내용중 아래부분은 체크박스 관련부분인데.<!-- single checkbox --> <div>판매 여부</div> <div> <div class="form-check"> <input type="checkbox" id="open" th:field="*{open}" class="form-check-input"> <label for="open" class="form-check-label">판매 오픈</label> </div> </div>제가 궁금한건 등록폼에서 체크박스필드이름인 open까지 즉itemName, price, quantity,와 open 이 4가지값이 POST로 보내지는데 받는부분은 아래와같이@PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes) { log.info("item.open={}",item.getOpen()); Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:/form/items/{itemId}"; }받게되는데. 여기서 질문:item 객체로 받는데 이게 궁금합니다..이거 넘기는 값전부에 해당하는 생성자가 없어도 객체로 만들어서 받아지는건가요??분명 item 클래스를 봐보면 @Data public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; private Boolean open; //판매 여부 private List<String> regions; //등록 지역 private ItemType itemType; //상품 종류 private String deliveryCode; //배송 방식 public Item() { } public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.quantity = quantity; } }이와 같이 Item클래스는 기본생성자와 itemName,price,quantity 3가지값만 받는 생성자밖에없는데.이와같이 itemName, price, quantity,와 open 이 4가지값을 받는 생성자가 없는데 도 스프링에서 4가지를 받는 생성자를 만들어서 객체를 만들어서 넘겨주는건가요??아래부분처럼 post로 보낸걸 받을때 딱맞는 생성자가없어도 item객체로 만들어지는게 궁금합니다.. 그냥 스프링에서 맞는생성자가 없어도 알아서 만들어서 넣어주는건가요?? 딱맞는 생성자가 없으면 객체를 못만드는거 아닌가요?? 이걸 어떻게 이해해야 하나요????@PostMapping("/add") public String addItem(@ModelAttribute Item item, 질문 : 등록폼에서 4가지 필드값을 보내는데받을때 @PostMapping("/add") 매핑에서@ModelAttribute Item item, 로 받았는데 item클래스를 살펴보면 4가지를 받는 생성자는 없는데도 Item객체로 만들어질수있나요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
multipart data 전송 관련 강의는 어디에 있나요?
multipart data 전송 관련 강의는 어디에 있나요?