inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

JPA 프록시 객체 AccessType.FIELD에서 getId 시 초기화?

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하십니까 선생님! 질문 제목을 보고 얘는 왜 이 질문을 여기에 올렸을까라고 의아해하실 수도 있는데, 사실 제가 영한님 스프링 관련 강의는 다 사서 열심히 보고 있는데(정말 도움 많이 받고 있습니다. 항상 정말 잘 듣고 있습니다!!) JPA는 영한님이 쓰신 JPA 책을 사서 보고 있습니다! 그런데 프록시 객체 파트를 읽어보던 도중 이해가 되지 않는 부분이 있어 질문을 쓰고 싶은데 JPA 쪽에 질문으로 쓰려고 해도 강의를 산 사람만 작성할 수 있어 부득이하게 여기에서 질문하게 되었습니다 죄송합니다 ㅜㅜㅜ 다름이 아니라 지금 JPA의 프록시 객체 파트를 공부하고 있습니다. 그런데 294P 의 8.1.2 프록시와 식별자 부분에서 엔티티를 em.getReference, 즉 프록시로 조회할 때 엔티티 접근 방식을 AccessType.PROPERTY 로 설정한 경우 getId를 호출해도 프록시를 초기화하지 않는다고 하셨습니다. 그래서 직접 한번 코드를 작성해보았습니다. 우선 AccessType.PROPERTY 방식부터 적용해보았습니다. PROPERTY와 FIELD 두 방식 모두 실험 전 create 옵션으로 Parent 객체 하나를 만들어두고 후에 none으로 바꾸어 진행했습니다. Parent 객체 생성 코드 Parent parent = new Parent(); parent.setId(1L); parent.setName("parent1"); em.persist(parent); Parent.java @Entity @Setter @Getter @Access(AccessType.PROPERTY) public class Parent { private Long id; private String name; @Id public Long getId() { return id; } } JpaMain.java public static void main(String[] args) { EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Parent foundParent = em.getReference(Parent.class, 1L); System.out.println(foundParent.getClass()); System.out.println(foundParent.getId()); System.out.println(foundParent.getName()); tx.commit(); em.close(); emf.close(); } 해당 코드를 실행시켰을 때 이렇게 나온걸 보니 확실히 getId 후에 getName 조회시 프록시 객체를 초기화(select 구문 실행)을 했다는 것을 알 수 있었습니다. 그런데 AccessType.FIELD로 조회하면 getId 를 할때에도 프록시 객체를 초기화한다고 하여 아래와 같이 Parent.java의 코드를 다시 작성하여 JpaMain.java를 실행해보았습니다. Parent.java @Entity @Setter @Getter @Access(AccessType.FIELD) public class Parent { @Id private Long id; private String name; } 제 예상으로는 getId 실행시 프록시 객체를 초기화 한다고 하셨으니 실제 출력에는 Parent의 getId()가 실행되기 전에 select 문이 실행되어야 할 것이라고 예상하였습니다. 하지만 위와 같이 getId()에는 프록시 객체를 초기화하지 않는 것처럼 보여지는 출력이 나왔습니다. 책에서는 AccessType.FIELD 사용시 getId()를 호출하면 JPA는 getId()가 id만 조회하는 메소드인지 다른 필드까지 활용해서 어떤 일을 하는 메소드인지 알지 못하므로 프록시 객체를 초기화한다 고 나와있는데 왜 이런 결과가 나온 것일까요? 제가 잘못 이해하고 있는 것이 있을까요?

  • java
  • spring
  • mvc
  • spring-boot
  • jpa
도등어 댓글 2 좋아요 0 조회수 174

AddressEntity 수정 2

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 내용] AddressEntity에 equals()와 hashCode() 메소드 재정의 ADDRESS 테이블에 2개의 값이 저장된다. 그리고 저장된 첫번째 값의 "new1"을 지우고 "new3"을 추가한다. 이렇게 했을 때 추가는 되었지만 삭제가 동작이 잘 되지 않았습니다. DB 쿼리문은 update 쿼리가 나간 상태입니다. 어떻게 해야 좋을지 막막하네요..제가 어디 빠트린 부분이 있을까요?

  • java
  • jpa
댓글 1 좋아요 0 조회수 110

AddressEntity 수정

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 내용] Address 값 타입을 AddressEntity에 한번 wrapping해서 엔티티로 생성한 후 findMember.getAddressHistory().remove(new AddressEntity("old1", "street", "10000")); findMember.getAddressHistory().add(new AddressEntity("new1", "street", "10000")); 값을 삭제 후 다시 등록 하였을 때 DB 안의 데이터가 다 사라졌는데, 제가 확인해 본 바로는 아마 해당 데이터의 id를 명시하지 않으니 어떤 식별자의 데이터인지 확인이 안돼서 로그창에 쿼리도 안나가고 DB의 데이터도 안들어가는건가요? 그리고 이럴 때 해결법은 어떻게 하면 좋을까요?

  • java
  • jpa
댓글 1 좋아요 0 조회수 84

코드 편집기 확장 프로그램

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

코드편집기에 6, 12번째 줄에 회색 바탕에 context, event, listener로 표시되어있는 확장 프로그램 저도 쓰고싶은데 혹시 vs코드에도 비슷한 프로그램 있을까요? 혹시 없다면, 웹스톰의 확장 프로그램은 무엇을 쓰시는지 알 수 있을까요?

  • node.js
  • express
  • nestjs
  • typeorm
댓글 2 좋아요 0 조회수 237

자바 빈 스펙을 준수하는지 체크하는 테스트

미해결

스프링 기반 REST API 개발

안녕하세요. 07.30 시간에 강사님께서 자바빈 스펙을 준수하게끔 테스트를 진행하십니다. 이 과정이 왜 필요한건지 궁금합니다~ builder패턴으로 테스트로만 잘 진행하면 충분하다는 생각이 들었기 때문입니다. 생성자로 객체를 만들어야 상태안전하게 만들 수 있고 setter를 사용하게 되는 것은 되도록 지양하는 것이라 생각했습니다.

  • java
  • spring
  • rest-api
창신동 장첸 댓글 2 좋아요 0 조회수 275

(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?

해결됨

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

만약 환경변수를 비밀저장소를 통해 받아온다면, 비밀 저장소 인증에 대한 환경변수는 어떤 방식으로 가져오는지 궁금합니다. (비밀저장소에 접근하기 위한 인증 정보는 로컬.env 파일에 저장해야 하는건가요?)

  • node.js
  • express
  • nestjs
  • typeorm
장봉준 댓글 2 좋아요 0 조회수 181

컴파일 오류가 왜 뜨는지 이해가 안되네요

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

Switch코딩처럼 간단하게 하려고 public static void main(String[] args){ int score = 100; String a; if (score >= 90) { a = "A"; } System.out.println("등급 = " + a); 이런 식으로 풀어봤는데 마지막 sout 부분 a에만 컴파일 오류가 뜹니다. public static void main(String[] args) { String a; if (true){a = "s";} System.out.println("a" + a); 근데 이건 실행이 되는 게 이해가 안되네요 결국 같은 거 아닌가요??

  • java
  • 객체지향
blackjaewoo 댓글 1 좋아요 0 조회수 136

(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

const getEnv = async ()=>{ const response = await axios.get(’/비밀키요청’) return response.data } 강의에서 위 코드를 통해 비밀키를 받아오는 예시를 작성해 주셨는데 ConfigModule.forRoot({isGlobal:true, load: [getEnv]}) 과정에서getEnv와 같은 비동기 함수를 등록한 경우 forRoot 내부적으로 await을 통해 메서드가 동작을 완료할때까지 기다리는지 궁금합니다.(비동기 함수를 등록해도 forRoot의 내부 동작으로 처리되는지?)

  • node.js
  • express
  • nestjs
  • typeorm
장봉준 댓글 3 좋아요 0 조회수 195

외래키를 사용하지 않아도 되는지 궁금합니다

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

이렇게 연관관계가 있는 키들은 외래키로 참조하고 있다는 표시를 하지 않아도 되는지 궁금합니다.

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
박태정 댓글 2 좋아요 0 조회수 262

채팅 클라이언트 문의

미해결

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

안녕하세요. 채팅 클라이언트 실습전에 먼저 구현을 해보았는데요. 클라이언트 메인에서 스레드를 스타트 하면 그 즉시 소켓이 닫히면서 프로그램이 종료되는 오류를 겪었습니다. 이는 클라이언트 메인에서 sender 스레드를 join하면서 해결하긴 했는데요. 영한님의 예제에서는 start() 만 하여도 프로그램이 종료되지 않는데, 왜 저의 코드는 종료될까.... try with resources 가 문제인가 싶다가도 그건 아닐거 같은 모호한 상황에 놓여서.... 제가 볼 땐 도무지 보이지 않아서, 코드 리뷰와 원인 파악을 부탁드리려고 질문을 남깁니다. MessageHandler.java package com.hoonjin.study.java.ionetwork.network.chat.client; import lombok.RequiredArgsConstructor; import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; import static com.hoonjin.study.java.util.MyLogger.log; @RequiredArgsConstructor public class MessageHandler implements Runnable { private final Socket socket; @Override public void run() { try (DataInputStream dis = new DataInputStream(socket.getInputStream())) { while (true) { String msg = dis.readUTF(); log(msg); } } catch (IOException e) { e.printStackTrace(); } } } MessageSender.java package com.hoonjin.study.java.ionetwork.network.chat.client; import com.hoonjin.study.java.ionetwork.network.chat.Command; import lombok.RequiredArgsConstructor; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.Arrays; import java.util.Scanner; import static com.hoonjin.study.java.util.MyLogger.log; @RequiredArgsConstructor public class MessageSender implements Runnable { private static final String DELIMITER = "\\|"; private final Socket socket; private boolean joined = false; @Override public void run() { Scanner scanner = new Scanner(System.in); try (DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) { while (true) { log("input message with cmd: "); String msg = scanner.nextLine(); if (msg.isEmpty()) { continue; } String[] split = msg.split(DELIMITER); String cmd = split[0]; if (Arrays.stream(Command.values()).noneMatch(c -> c.value().equals(cmd))) { log("wrong command"); continue; } if (cmd.equals(Command.EXIT.value())) { dos.writeUTF(msg); joined = false; break; } else if (cmd.equals(Command.JOIN.value())) { joined = true; } if (joined) { dos.writeUTF(msg); } } } catch (IOException e) { e.printStackTrace(); } } } ChatClient.java package com.hoonjin.study.java.ionetwork.network.chat.client; import java.io.IOException; import java.net.Socket; public class ChatClient { private static final String SERVER = "localhost"; private static final int PORT = 23456; public static void main(String[] args) throws IOException, InterruptedException { try (Socket socket = new Socket(SERVER, PORT)) { Thread messageHandler = new Thread(new MessageHandler(socket)); Thread messageSender = new Thread(new MessageSender(socket)); messageHandler.start(); messageSender.start(); messageSender.join(); // 이 부분이 없으면 시작하자마자 즉시 종료됨 } catch (IOException e) { e.printStackTrace(); } } } Command.java package com.hoonjin.study.java.ionetwork.network.chat; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum Command { JOIN("/join"), MESSAGE("/message"), CHANGE("/change"), USERS("/users"), EXIT("/exit") ; private final String value; public String value() { return value; } } 이상입니다. 확인해주시면 감사하겠습니다. 새해복 많이 받으세요!

  • java
  • 네트워크
  • 객체지향
헬로월드 댓글 1 좋아요 0 조회수 125

메서드 추출 시 매개변수

해결됨

김영한의 실전 자바 - 기본편

public static void volumeUp(MusicPlayerData data) { data.volume++; System.out.println("음악 플레이어 볼륨: " + data.volume); } 반복되는 기능을 이후에 재사용하기 위하여 메서드를 추출할 때 매개변수에 (MusicPlayerData data)라고 적어주셨어요. 1) 이때 [MusicPlayerData]라는 것은 클래스(틀, 설계도, 붕어빵틀)인가요? 이게 맞다면,, 그럼 이건 매개변수(파라미터)안에 클래스를 넣은것이라 볼 수 있나요??? 2) MusicPlayerData 클래스 안에 있는 int 변수 [volume]이라는 것은 객체(붕어빵 틀에서 만들어진 붕어빵)라고 하는 것인가요? 용어 정리가 되지 않아 질문드립니다. 답변 감사합니다..

  • java
  • 객체지향
땅콩 댓글 1 좋아요 1 조회수 117

정적 중첩 클래스 질문

미해결

김영한의 실전 자바 - 중급 1편

외부 클래스안에 정적 중첩 클래스가 있고, 중첩 클래스 안에 정적 멤버와 인스턴스 멤버들이 있다고 가정할때, 다른클래스의 메인함수에서 외부클래스의 인스턴스를 생성하면, 이 때, 외부클래스의 대한 정보와, static멤버에 대한 정보가 메서드 영역에 저장되는데, 이때 정적 중첩 클래스도 static이라 같이 메서드영역에 정보가 저장되나요? 그리고 별개로 정적 중첩 클래스의 인스턴스를 생성해야만 중첩 클래스의 인스턴스를 생성해야만 중첩 클래스의 인스턴스 멤버들을 사용할 수 있는거죠??

  • java
  • 객체지향
진우 댓글 1 좋아요 0 조회수 142

MyListEx 질문드립니다.

해결됨

기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM

MyListEx 생성자에서 UserData 를 매개변수로 받도록 설계한 이유에 대해 궁금합니다. MyNode 라는 추상 자료형(ADT)을 정의해 두셨는데, 생성자에서 특정 구현체인 UserData 를 직접 받는 방식이 추상화의 장점을 제한할 수 있다고 생각합니다. 또한, onRemoveNode 메서드에서도 UserData 타입으로 변환하지 않고 MyNode 에 정의된 메서드만으로도 충분히 기능 구현이 가능해 보이는데, 혹시 MyListEx 는 UserData를 위한 전용 자료구조로 설계된 것인가요? 그렇지 않다면, MyNode 를 기반으로 유연성을 유지하도록 설계하는 것이 더 적합하지 않을까 하는 생각이 들어 질문드립니다.

  • java
  • 객체지향
  • jvm
  • data-structure
Hahahabah 댓글 1 좋아요 1 조회수 154

Stack.navigator오류가 있어요

미해결

맛집 지도앱 만들기 (React Native & NestJS)

똑같이 해도 어떨떄는 문제가 있다고 하고 어떨떄는 문제가없다고 하는데 [{ "resource": "/c:/Porject/ReactNative/pr/acliet/src/app/stack/AuthStackNavigator.tsx", "owner": "typescript", "code": "2741", "severity": 8, "message": "Property 'id' is missing in type '{ children: Element[]; }' but required in type '{ id: undefined; }'.", "source": "ts", "startLineNumber": 17, "startColumn": 6, "endLineNumber": 17, "endColumn": 21, "relatedInformation": [ { "startLineNumber": 63, "startColumn": 5, "endLineNumber": 63, "endColumn": 7, "message": "'id' is declared here.", "resource": "/c:/Porject/ReactNative/pr/acliet/node_modules/@react-navigation/core/lib/typescript/module/src/types.d.ts" } ] }] 오류로 id가 없다고 하네요 import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import AuthHomeScreen from '../../pages/AuthHomeScreen'; import LoginHomeScreen from '../../pages/LoginHomeScreen'; import SignupHomeScreen from '../../pages/SignupHomeScreen'; import {authNavigator} from '../../config/AuthNavigator'; export type AuthStackParams = { [authNavigator.AUTH_HOME]: undefined; [authNavigator.LOGIN]: undefined; [authNavigator.SIGNUP]: undefined; }; const Stack = createStackNavigator<AuthStackParams>(); const AuthStackNavigator = () => { return ( <Stack.Navigator> <Stack.Screen name={authNavigator.AUTH_HOME} component={AuthHomeScreen} /> <Stack.Screen name={authNavigator.LOGIN} component={LoginHomeScreen} /> <Stack.Screen name={authNavigator.SIGNUP} component={SignupHomeScreen} /> </Stack.Navigator> ); }; export default AuthStackNavigator; 대한 정보가 없을경우 답변이 어렵습니다.

  • react-native
  • typescript
  • nestjs
  • react-query
  • zustand
정근혁 댓글 1 좋아요 0 조회수 170

em.persist(orderItem) 주석

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

[질문 내용] 따로 주석 설명을 달긴 하였지만, Order 엔티티에서 OrderItem 엔티티를 영속성 전이 ALL로 설정을 해놓았으면 굳이 em.persist(orderItem)을 생략해도 잘 동작되는 거죠? 추가 질문) 위 2개 이미지에서 보시면 첫번째 사진은 em.persist(orderItem)을 생략했을때 나온 쿼리문이고 두번째 사진은 생략하지 않을 때 나오는 쿼리문인데 왜 update 쿼리가 나가는 건지 잘 이해가 안돼서 여쭈어 봅니다.

  • java
  • jpa
soojinkimss 댓글 2 좋아요 0 조회수 60

static내부 클래스, 내부 클래스 질문

미해결

김영한의 실전 자바 - 중급 1편

static 내부 클래스에서는 staic변수나, 메서드를 선언할 수 있는데, 왜 비정적 내부클래스에서는 static변수나 메서드 선언할 수 없나요? static내부 클래스는 비정적 내부 클래스와는 독립적이어서 static멤버들을 선언 가능한건가요?

  • java
  • 객체지향
진우 댓글 1 좋아요 0 조회수 136

파일 실행이 안됩니다.

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] HomeController.java 와 home.html을 다 작성하고 localhost:8080으로 실행하려고 하니 HomeController.java가 실행이 안됩니다. 인터넷에는 src를 리소스 루트로 지정하고 하면 된다고 해서 리소스 루트로 src를 지정하고 첫 번째 사진과 같이 파일 위치를 지정하는 부분에서 계속 없다고 뜨는데 어떻게 해야하나요?

  • java
  • spring
  • mvc
  • spring-boot
simjiyoung12 댓글 2 좋아요 0 조회수 174

iOS오류 pod install오류

미해결

맛집 지도앱 만들기 (React Native & NestJS)

pod install 이든 npc pod install이든 계속 저 installing boost쪽에서 에러가 뜹니다 윈도우 pc에서 만들던 프로젝트 맥북을 구매하게 되어 맥북으로 하고있는데 안드로이드 에뮬레이터는 npx react-native run-android를 이용해 동일하게 잘 되는데 ios는 되지 않아 막막합니다 어떻게 해결해야 할까요?? npx react-native run-ios 를 했을시 나오는 오류입니다 도와주시면 감사하겠습니다! https://github.com/boostorg/boost/issues/843#issuecomment-1872943124 이것도 참고해봣지만 해결되지않았습니다 ios가 하고싶은데 너무 절실해서 부탁드릴게요 ㅠㅠ

  • react-native
  • typescript
  • nestjs
  • react-query
  • zustand
kjm010629 댓글 4 좋아요 0 조회수 331

2024년 필기 2회 04분11초에 나오는 문제 질문 드립니다.

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

int arr[3][3] 은 3x3 행렬이라 이렇게 그려지는 것은 이해했습니다. int arr [3][3] arr[0] = [1, 2, 3] arr[1] = [4, 5, 6] arr[2] = [7, 8, 9] 여기에서 arr[0] 을 100번지 주소, arr[1]을 200번지 주소, arr[3]을 300번지 주소라고 가정을 해보겠습니다. 이때 int parr[2]가 강사님께서 말씀하신게 포인터 두개를 담은 배열이라고 하셨는데 이 부분이 잘 이해가 안가서요. 포인터 두개를 담은 배열이라고 하신다면 int parr[2]에는 arr[1] 이라는 200번지 주소, arr[2] 이라는 300번지 주소가 담긴거고, 이때 parr을 행렬로 만들게 되어서 parr은 다음과 같이 되어서 정답을 유도하게 되는건가요? int parr [2][3] parr[0] = [4, 5, 6] parr[1] = [7, 8, 9]

  • python
  • java
  • c
  • 정보처리기사
myppy2628 댓글 2 좋아요 0 조회수 156

13분에 createQuery를 할려고 하는데 . qlString이 안 뜹니다 !

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들 께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.

  • java
  • spring
  • mvc
문정욱 댓글 2 좋아요 0 조회수 139

인기 태그

인프런 TOP Writers

주간 인기글