묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨토비의 스프링 6 - 이해와 원리
안녕하세요 jdk 질문드려요
안녕하세요! 토비님 같은 버전의 jdk에서도 zulu나 강의에서 예시로 다운받으신 liberica와 같이 회사가 다른데 혹시 그들만의 차이점이 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult는 SSR에서만 쓰이는 방식인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]BindingResult는 ssr 방식에서 사용하는 방식 같은데 맞나요..? csr 방식일 때는 컨트롤러 어드바이스로 예외를 던져주고 그 예외를 웹쪽에서 따로 처리해주는 게 일반적인걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
/api/v1/members 버그
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사님처럼 코드를 다음과 같이 작성했습니다.MemberApiController.javapackage jpabook.jpashop.api; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jpabook.jpashop.domain.Member; import jpabook.jpashop.service.MemberService; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; @RestController @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @GetMapping("/api/v1/members") public List<Member> membersV1() { return memberService.findMembers(); } @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long joinedMemberId = memberService.join(member); return new CreateMemberResponse(joinedMemberId); } @PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } @Data static class CreateMemberRequest { @NotEmpty private String name; } @Data @AllArgsConstructor static class CreateMemberResponse { private final Long id; } @Data static class UpdateMemberRequest { @NotEmpty private String name; } @Data @AllArgsConstructor static class UpdateMemberResponse { private Long id; private String name; } } MemberService.javapackage jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; /* * 회원 가입 * */ @Transactional public Long join(Member member) { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } /* * 중복 확인 메서드 * */ private void validateDuplicateMember(Member member) { List<Member> findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } } // 회원 전체 조회 public List<Member> findMembers() { return memberRepository.findAll(); } public Member findOne(Long memberId) { return memberRepository.findOne(memberId); } @Transactional public void update(Long id, String name) { Member member = memberRepository.findOne(id); member.setName(name); // 영속성 컨텍스트에서 엔티티를 수정하면 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)가 동작한다. } } MemberRepository.javapackage jpabook.jpashop.repository; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jpabook.jpashop.domain.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; // 컴포넌트 스캔에 의해 // 스프링 빈에 자동으로 등록 @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } public List<Member> findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } public List<Member> findByName(String name) { return em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); } } Member.javapackage jpabook.jpashop.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } 그리고 postman으로 localhost:8080/api/v1/members로 호출을 하게 되면 다음과 같이 무지막지하게 많은 양의 결과가 나옵니다. 왜 그러는 걸까요?
-
미해결토비의 스프링 6 - 이해와 원리
개발환경 세팅에서 질문있어요.
안녕하세요. 토비님.좋은 강의 만들어주셔서 감사합니다.질문이 하나 있습니다.개발환경 세팅에서 bash 명령어를 추천해주는 툴? 플러그인을 사용하고 있는것으로 보이는데요.무엇인지 알려주시면 좋겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
build.gradle 에러
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle에서 에러가 발생합니다 자바 버전 17 사용했습니다Could not apply requested plugin [id: 'io.spring.dependency-management', version: '1.1.5'] as it does not provide a plugin with id 'io.spring.dependency-management'. This is caused by an incorrect plugin implementation. Please contact the plugin author(s).> Plugin with id 'io.spring.dependency-management' not found.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드 연결하는데 데베에 문제가 있다고 하네요
Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:143) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]이런식의 오류가 났는데 데베설정이 잘못돼서 그런건가요 코듣상의 문제는 없는거 같습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
홈화면 추가에서 index.html이 실행되고 home이 실행이 안되는 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의 보고 똑같이 코딩했는데localhost:8080이렇게넣었을때 welcom화면으로 index.html이 뜹니다다른분들이질문하신 글들을 다 읽어보고 답변해주신내용들 대로 다 실행해보았으나 해결이 되지 않아, 같은 내용이지만 글을 올립니다..home에서 ctrl + B했을때 home.html화면이 잘 떴었고,전체기간 캐시도 삭제해 봤습니다..그리고 index.html지우면 화이트라벨 에러뜨면서 안되더라구요.제거https://drive.google.com/file/d/1mDv9-Z_r6aChpDBx1ZhtlJZL0dZG6Hzj/view?usp=sharing
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 프로젝트 생성 문의
프로젝트 생성해서 자바 17버전을 깔고 다시 나갔다 들어오니 처음 화면이 저렇게 나옵니다 우측 선생님과 같은 화면이 안나오는데 어떻게 해야하나요??
-
미해결스프링 핵심 원리 - 기본편
8분 10 초 영상 AutoAppConfigTest
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]8분 10 초에서 AutoAppConfigTest 에서 basicSacan Test 할 때 왜 OrderServiceImpl 생성자가 호출이 되는건가요..? ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
redirectAttributes 질문
@PostMapping("/login") public String loginV4(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, // @RequestParam(defaultValue = "/") String redirectURL, RedirectAttributes redirectAttributes, HttpServletRequest request) { if (bindingResult.hasErrors()) { log.info("errors={}", bindingResult); return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); log.info("login? {}", loginMember); if (loginMember == null) { bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); log.info("bindingResult={}", bindingResult); return "login/loginForm"; } //세션이 있으면 있는 세션 반환, 없으면 생성 HttpSession session = request.getSession(); //세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); //redirectURL 적용 log.info("request.getParameter={}",request.getParameter("redirectURL")); redirectAttributes.addAttribute("redirectURL", request.getParameter("redirectURL")); return "redirect:{redirectURL}"; }맨 아래에서 강사님과 다르게 @RequestParam을 사용하지 않고 RedirectAttributes와 getParameter를 이용해서 처리를 해 보려 했는데,실행 결과 {redirectURL}의 부분이 'localhost:8080/%2Fitems' 로 뜹니다.redirectAttributes에 넣을 때 잘못된 건가 싶어서 request.getParameter의 로그를 찍어보면 정상적으로 /items로 나옵니다.어디가 잘못 된 건지 여러 번 돌려봐도 모르겠어서 질문 남깁니다! 추가 : URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험하다. 다음에 설명하는 RedirectAttributes 를 사용하자.라고 하셨는데 @RequestParam 으로 받은 변수값을 써도 괜찮은 건지 잘 모르겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test-resources - application-test.yml로 했을 때 h2에 테이블이 생성되지않아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의대로 application.yml로 했을 때는 생성이 잘 되었습니다.그런데 test -resource - application-test.yml로 넘어가니h2에 Member테이블이 생성되지 않습니다. 어떻게 해야할까요?
-
미해결스프링 핵심 원리 - 기본편
Order 1분20초 질문
orderApporder학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.order 부분 오류가 났는데 toString연결 부분인데 왜 오류가 난건지 모르겠어요..
-
미해결예제로 배우는 스프링 입문 (개정판)
jar 안되는 분들 참고하세요
java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar강의에서 처럼 주소 지정이 안찾아지는 분들은 왼쪽 상단바에 jar검색하셔서 해당하는 주소값을 마지막에 적으시면됩니다.왼쪽 파일 검색 jar검색java -jar target/해당하는 파일명.jarex)java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ide 질문
안녕하세요 이제 막 수업을 따라가려하는데 이클립스, 인텔리제이가 아닌 sts4로 실습을 해도 괜찮은지자바 버전은 11로 알려주셨지만 11이상의 다른 버전으로 해도 무방한지 여쭙고 싶습니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan과 @SpringBootApplication 관계
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]AutoAppConfig와 같은 설정 클래스를 만들지 않아도 @SpringBootApplication에 @ComponentScan이 있기 때문에, CoreApplication 클래스가 위치한 hello.core가 스캔 시작 범위가 되고, 하위의 모든 패키지에 존재하는 @Component를 인식하여 빈으로 등록하는 건가요?AutoAppConfig와 같은 설정 클래스를 만들지 않아도 @SpringBootApplication의 @ComponentScan에 의해 빈을 등록하지만, AutoAppConfig를 만드는 이유는, ComponentScan 범위를 지정하고, Filter를 사용하기 위함인가요?
-
해결됨스프링 핵심 원리 - 기본편
log-demo 페이지로 들어갔을 때 404에러가 뜹니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.core코드 전체: https://drive.google.com/drive/folders/1AI5Fsayi4Exge6nyVABAneWwkaY10HHs?usp=drive_link분명 잘 따라한 것 같은데 log-demo페이지에 접속했을 때 404 에러가 뜹니다. 스프링 3버전을 사용해서 javax가 아닌 jakarta를 사용하고 있는데, 이부분이 문제가 될 수도 있나요?
-
해결됨스프링 핵심 원리 - 기본편
안녕하세요. 필드DI에 대해 질문드립니다.
https://www.inflearn.com/questions/340767/%ED%95%84%EB%93%9C-%EC%A3%BC%EC%9E%85%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%9C%EA%B2%8C%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4<테스트 코드 때문에 필드DI를 지양해야 하는 것 이 맞는가?>안녕하세요 담당자님.위 링크에 적힌 내용에 이어서 질문을 드립니다.위 링크를 읽어본 결과 필드 DI를 지양해야 하는 이유 중 하나는 테스트 할 때 순수 자바환경에서 구현 불가능한 방법이기 때문이라고 이해했습니다.하지만 위와 같은 이유로 필드DI를 지양한다는 것이 이해가 안됩니다.실제 어플리케이션 코드에서는 필드DI를 하고, 스프링 없는 테스트 환경에서는 생성자든 setter든 직접 객체를 넣어주면 아무 문제 없지 않을까요?물론 설명해주신 필드DI의 단점은 좀 더 있지만, 테스트 코드 때문에 필드DI를 지양해야 하는 것 이 맞는가에 대한 의문이 들어서 질문드립니다.감사합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
ApiResponse에 대해 질문있습니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. ApiResponse클래스에 HttpStatus와 code를 같이 보내게 되는데 사실 ResponseEntity.ok().body(ApiResponse~~~)이런 식으로 보내게 된다면 httpstatus가 HTTP 메시지의 바디에도 있고 헤더에도 있게 되는데 굳이 바디에 한 번 더 보내시는 이유가 있으신가요??실무에서는 어떻게 하시는 지 궁금합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
pdf의 Exception 자바 직접 실행 부분에서 궁금한 점이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래는 pdf에 나온 설명입니다. Exception(예외)자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main 이라는 이름의 쓰레드가 실행된다. 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰 레드는 종료된다. 자바 문법책으로 공부할 때 try catch 없이 예외가 터지면 프로그램이 종료되고,try catch 없더라도 throws를 통해 메서드를 호출한 곳으로 떠넘기면, 그곳에서 try catch를 하거나, 아니면 또 계속 떠넘겨서 main 메서드에서도 throws를 통해 JVM이 예외를 처리하는 방법도 있다고는 알고 있습니다. 강의 자료 pdf에 나온 "실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면" 이 의미는 throws 키워드를 사용해서 계속 떠넘겼다는 의미인가요? 아니면 throws를 안 쓰더라도 저런 식으로 예외가 넘어간다고 생각하면 되는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의를 들어보면 loginV3메소드 파라미터에 HttpServletRequest request를 선언하고 HttpSession session = request.getSession(); 을 통해 세션을 생성하는 것을 볼 수 있었습니다.하지만, 저는 프로젝트를 진행할 때 세션이 사용되는 메서드에 파라미터를 HttpSession session을 사용했습니다.그래서, HttpSession session = request.getSession(); 이와 같은 코드 없이 세션을 생성하거나 삭제하였습니다. 둘의 차이가 있을까요? 굳이 HttpSession session = request.getSession(); 를 작성할 필요가 있나요?아래는 저의 코드입니다.