안녕하세요. 우선!! 강사님 덕분에 자바에 대해 이해가 더 잘 되고 있습니다. 감사합니다 강의를 듣다 궁금한 내용이 생겨 질문하게 되었습니다. 자바의 변수는 기본형과 참조형으로 나눌 수 있고, 기본형의 경우 변수에 값이 저장되어 출력되지만 참조형은 메모리에 저장된 위치 값이 저장되어 출력된다고 가르쳐주셨습니다. 그렇다면 기본형 int a = 10;이 있다면 메모리상에는 변수 a가 가리키는 공간에 10이라는 값이 저장되는데 a를 출력하였을 때 어떻게 바로 10이라는 값이 나오는지 궁금합니다. a를 출력하게 되면 메모리상에서 a라는 변수 값을 저장한 공간을 찾게 되고 그 공간에 있는 값인 10을 출력하게 되는데 참조형과 다르게 바로 값이 나오는 이유가 궁금합니다. 감사합니다..!
ClientRegistrationRepository 를 구성하는 방법으로 client_id, secret 을 properties 나 빈으로 만들어 준비하는 방식으로 많이 예제가 있는데 Resource Owner 와 Client 가 동일해 client_credentials 방식으로 인가를 진행하고 싶을 경우 어떻게 customizing 할 수 있을까요? 고객사마다 가입해 client_id, secret 을 발급받는 상황에서는 미리 properties 나 bean 으로 하드 코딩 해둘 수 없을 것 같습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요, 다름이 아니라 [김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음] / 9. 메서드 / 은행 계좌 입출금 문제 에 관련하여 질문이 있어 작성하게 되었습니다. 해당 문제에 대해 입력값은 다음과 같다고 생각하고 BufferedReader로 풀었습니다. 1 10000 2 8000 2 3000 3 4 package method; // TODO 1. 공통 출력 부분을 start()라는 메서드로 따로 빼서 반복 호출하여 수행 // TODO 2. 입금 출금 등 요구 사항에 따라 구현이 다른 부분을 메서드로 추출 // TODO 3. 이때, 선택에 따른 숫자값과 입금액 및 출금액 등을 파라미터로 전달 // TODO 4. 잔액 확인 및 종료는 별다른 연산이 필요 없으므로 void로 설계 // TODO 5. 이때, 종료는 종료라는 책임이 해당 메서드에 배당이 되어야 하므로 메서드 내부에서 System.exit(0);을 수행 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Method { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; String str; int balance = 0; while ((str = br.readLine()) != null) { st = new StringTokenizer(str, " "); int index = Integer.parseInt(st.nextToken()); // TODO Operator '==' cannot be applied to 'boolean', 'int' // TODO == 연산자는 boolean 타입과 int 타입 사이에서 지원 / 적용될 수 없습니다. -> int가 아닌 boolean을 지원한다는 것 int money = (st.hasMoreTokens()) ? depositOrWithdraw(st) : 0; if (index == 1) { balance = deposit(index, balance, money); } else if (index == 2) { balance = withDraw(index, balance, money); } else if (index == 3) { check(index, balance); } else { exit(index); } } } private static int depositOrWithdraw(StringTokenizer st) { return Integer.parseInt(st.nextToken()); } private static void start() { System.out.println("---------------------------------"); System.out.println("1.입금 | 2.출금 | 3.잔액 확인 | 4.종료"); System.out.println("---------------------------------"); } private static int deposit(int index, int balance, int depositAmount) { start(); System.out.println("선택: " + index); balance += depositAmount; System.out.println("입금액을 입력하세요: " + balance); System.out.println(balance + "원을 입금하였습니다. 현재 잔액: " + balance + "원"); return balance; } private static int withDraw(int index, int balance, int withdramAmount) { start(); System.out.println("선택: " + index); if (balance >= withdramAmount) { balance -= withdramAmount; System.out.println("출금액을 입력하세요: " + withdramAmount); System.out.println(balance + "원을 출금하였습니다. 현재 잔액: " + balance + "원"); } else { System.out.println(withdramAmount + "원을 출금하려 했으나 잔액이 부족합니다."); } return balance; } private static void check(int index, int balance) { start(); System.out.println("선택: " + index); System.out.println("현재 잔액: " + balance + "원"); } private static void exit(int index) { start(); System.out.println("선택: " + index); System.out.println("시스템을 종료합니다."); System.exit(0); } } 그런데, 답지 코드를 보니 BufferedReader가 아닌 Scanner더군요. 제가 아직 Scanner는 잘 써보지 않아서 입력값이 주어지지 않은 상황에서 Scanner로 작성된 코드를 BufferedReader로 어떻게 변환해야할지 를 잘 모르겠습니다. 따라서 질문은 다음과 같습니다. 입력값이 위와 같이 주어진다고 생각하고 푸는게 맞는지 맞다면, 해당 BufferedReader 코드도 동일한 값을 내는게 맞는지 아니라면, 어느 부분을 잘못 작성하였으며 어떻게 수정하면 되는 것인지 앞으로 하드 코딩이 아니라 프로그램을 작성하는 문제에 대해서는 입력값을 어떻게 고려하여 작성하면 좋을지 궁금합니다. 감사합니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
UpdateUser 사용시 deleteUser 사용시 2024-02-10 21:46:30.786 ERROR 10012 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result: 2; nested exception is javax.persistence.NonUniqueResultException: query did not return a unique result: 2] with root cause 오류코드를 보니 updateUser는 findById의 결과값이 고유하므로 문제가 일어나지않는데, deleteUser는 findByName으로 유저를 찾기때문에 같은 이름이 존재하면 결과값이 고유하지않으므로 오류가 발생하는거 같은데, (엄준식이 2명존재) 처음부터 Id 값을 받아오거나 생성시에 같은 이름을 못만들게 막는거 말고는 해결할 방법이 없을까요?
안녕하세요. 좋은 강의 너무 감사합니다. 개발자PARK님 spring+전자정부프레임워크 수강을 신청했습니다. 여기저기 살펴보다 보니 고마우신 글이 있어 실례지만 부탁 드려봅니다. EA + egovframe 신규 강의 무료쿠폰 주신다 하여 쪽지를 남겨봅니다. 너무 감사합니다! 새해 복많이 받으시고 건강조심하셔요. 그리고 즐거운 설 명절되셔요 또 좋은 강의 기대하겠습니다 감사합니다.
안녕하세요~ 일코님 (맞는지 모르겠네요.) 어젠가 그젠가 부터 https://martinii.fun/ 사이트 접속이 안되네요.. ㅠㅠ 아무튼 질문은 표밖의 글자만 일괄 수정작업을 하고 있습니다. 볼드체만 추려서 일괄적으로 작업하고 있는데, 표안의 글자들이 바뀌고는 해서 표안의 글자는 패스~ 하게 하고 싶어서 홈페이지를 찾아보려했는데 저만 그런건지 먹통이네요.. ㅠㅠ 현재 상태는 1번부터 100번 문제가 있으면, 중간중간 지워야 하는 문제들이 있어서 넘버링 작업을 하고 있습니다. (1~XX 번까지 순서대로 수정하는 작업) 이것을 자동화하는 중에 각 문제마다 지문이 표안에 있습니다. 예) 번호(볼드) 문제 지문(표안에 있음) 이렇게 문제들의 반복인데, 간혹 지문(표안에 있는)에 볼드 숫자들이 들어가서 문제의 번호를 일괄로 바꾸다가 지문의 숫자가 바뀌어서 좀... 난간하게 되는데, 표안의 문자들은 패스하게 하는 코드를 알고 싶습니다. 그러니까... 문자가 표안에 있는지 여부를 확인 할 수 있으면 될것같습니다. 설 연휴 잘 보내시고, 새해 복 많이 받으세요~~
안녕하십니까 선생님. 강의 너무 잘 듣고 있는 머신러닝 꿈나무 도은우입니다. 저는 현직의사로 의료ai의 길을 걸을려고 하는데 선생님의 강의가 너무 많은 도움이 되고 있습니다. 다름이 아니라, 인디언 당뇨병 예측에서 zero_features의 0의 값을 zero_features의 값의 mean으로 replace하셨는데, 이럴경우에 애초에 0이 있는것 때매 의미 있는 평균값이 나오지 않는다고 저는 생각했습니다. 애초에 0이 아닌 값들의 평균으로 하는건 어떤가요>???
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
User클래스의 getter들을 정리하고싶어서 Lombok의 @Getter 어노테이션을 사용해봤는데 컴파일 에러가 나요 ㅠㅠ User 클래스를 @Getter 로 만든사진 UserResponse 클래스가 getId/getName/getAge 메소드를 찾지 못했다는 에러가 발생합니다. User 클래스에 Getter를 직접 만들어준 모습 정상작동하는모습 롬복은 컴파일 시점보다 빠르게 getter을 만들어주는게 맞는데, 제가 모르는 JPA관련 체킹로직이 롬복이 getter을 만들기전에 동작해서 오류가 발생하는걸까요? 다른 class들은 @Getter관련 문제가 없었거든요.. 제 나름대로 왜 이럴까 + 해결방법을 고민해봤는데 잘모르겠어서 질문남깁니다... 질문입니다!! @Entity가 붙은 class 에는 @Getter 어노테이션을 사용할 수 없나요:? +추가) 생성자 관련 어노테이션도 안되는것 같습니다. 2024-02-10 20:44:49.142 ERROR 15448 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: No default constructor for entity: : com.group.libraryapp.domain.User; nested exception is org.hibernate.InstantiationException: No default constructor for entity: : com.group.libraryapp.domain.User] with root cause ///// @NoArgsConstructor(access=AccessLevel.PROTECTED) ///////////////////////////////////////// protected User() {} 에러메세지에 No default construtor라는데 둘이 같지 않나요? 이거도 역시 직접 생성자를 만들어주니 문제없이 작동하네요.. 롬복이 문제인걸까요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요, 우선 좋은 강의에 감사드립니다. 다름이 아니라, 강의를 듣는 도중 멀티 체크박스를 정의하는 과정에서 #ids.prev('regions') 부분에서 이해가 되지 않았습니다. th:each 를 사용하는 경우 id에 1, 2, 3과 같은 숫자를 붙여 regions1, regions2.. 와 같이 만드는데, 왜 #ids.prev 에선 'regions' 를 입력으로 넣는지가 이해가 되지 않았습니다. (뿐만 아니라 전체 흐름을 조금 더 명확하게 이해하고 싶었습니다.) 구글링을 해봤는데, 해당 강의에 대한 블로그 정리는 많지만 제가 원하는 내용은 찾지를 못했습니다..ㅜㅜ 그래서, 이번 기회에 소스코드를 찾아보며 이해를 해보려고 했는데, 아래 작성된 과정이 맞는지, 제가 잘 이해한게 맞는지가 궁금하여 질문 드리게 되었습니다. 너무나도 긴 질문이라 미리 죄송하다는 말씀 드립니다.. 다음 코드는 SpringInputCheckboxFieldTagProcessor 클래스의 doProcess() 와, AbstractSpringFIeldTagProcess 클래스의 computeId() 메서드 입니다. protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName, String attributeValue, IThymeleafBindStatus bindStatus, IElementTagStructureHandler structureHandler) { String name = bindStatus.getExpression(); name = name == null ? "" : name; String id = this.computeId(context, tag, name, true); // 이하 생략.. } protected final String computeId(ITemplateContext context, IProcessableElementTag tag, String name, boolean sequence) { // 이전 부분 생략.. if (sequence) { Integer count = context.getIdentifierSequences().getAndIncrementIDSeq(id); return id + count.toString(); } } computeId() 를 보면, sequence 인 경우(→ 이 경우는 th:each가 들어간 경우라고 추측합니다.) Id에 count 를 붙여서 반환하도록 되어있습니다. 2. IdentifierSequences 클래스 public final class IdentifierSequences { private final Map<String, Integer> idCounts = new HashMap(1, 1.0F); public IdentifierSequences() { } public Integer getAndIncrementIDSeq(String id) { Validate.notNull(id, "ID cannot be null"); Integer count = (Integer)this.idCounts.get(id); if (count == null) { count = 1; } this.idCounts.put(id, count + 1); return count; } public Integer getPreviousIDSeq(String id) { Validate.notNull(id, "ID cannot be null"); Integer count = (Integer)this.idCounts.get(id); if (count == null) { throw new TemplateProcessingException("Cannot obtain previous ID count for ID \\"" + id + "\\""); } else { return count - 1; } } } IdentifierSequences 클래스를 보면, idCounts 라는 Map에 id와 count 정보를 저장하고, 1에서의 computeId() 는 getAndIncrementIDSeq() 를 통해 count 정보를 얻어냅니다. 이 세부 과정을 생각해보면, 처음에 th:field=”*{regions}” 를 통해 regions라는 id가 들어가면 IdentifierSequences 클래스의 Map<String, Integer> idCounts 에는 regions라는 id가 없어 getAndIncrementIDSeq() 의 count값은 1이 됩니다. this.idCount.put(id, count + 1); 을 통해 idCounts에는 {”regions” : 2} 가 저장되며, getAndIncrementIDSeq() 가 반환하는 count값은 1이 됩니다. 즉, 처음에 regions라는 id가 들어가면, 이는 <input> 태그에는 regions1이라는 id로 지정되지만 IdentifierSequence 의 idCount 맵에는 count가 2로 되어있는 상태입니다. IDs 클래스 public class Ids { private final ITemplateContext context; public String prev(Object id) { Validate.notNull(id, "ID cannot be null"); String str = id.toString(); return str + this.context.getIdentifierSequences().getPreviousIDSeq(str); } public Ids(ITemplateContext context) { Validate.notNull(context, "Context cannot be null"); this.context = context; } } 그러면 #ids.prev(’regions’) 를 통해 label이 regions1 로 등록되는 과정은 다음과 같이 이해할 수 있을 것 같습니다. prev 메서드는 id를 입력받아, IdentifierSequence 의 getPreviousIDSeq() 을 호출하여 얻은 숫자를 뒤에 붙여 label의 id를 지정합니다. 이전 문단의 IdentifierSequence 의 getPreviousIDSeq() 코드를 보면, idCount에서 얻은 count에 1을 빼서 반환합니다. idCount에는 count가 2로 지정되어 있기에, 최종적으로 #ids.prev(’regions’)의 결과는 regions1이 됩니다. 활용 : #ids.next 의 사용 <label th:for="${#ids.next('regions')}" th:text="${region.value}" class="form-check-label">서울</label> <input type="checkbox" th:field="*{regions}" th:value="${region.key}" class="form-check-input"> label과 input 태그의 위치를 바꾸고 #ids.next를 사용하면, 이전과 같이 label의 for와 input의 id를 일치시킬 수 있습니다. 결과는 다음과 같습니다. <!-- multi checkbox --> <div> <div>등록 지역</div> <div class="form-check form-check-inline"> <label for="regions1" class="form-check-label">서울</label> <input type="checkbox" value="SEOUL" class="form-check-input" id="regions1" name="regions"><input type="hidden" name="_regions" value="on"/> </div> <div class="form-check form-check-inline"> <label for="regions2" class="form-check-label">부산</label> <input type="checkbox" value="BUSAN" class="form-check-input" id="regions2" name="regions"><input type="hidden" name="_regions" value="on"/> </div> <div class="form-check form-check-inline"> <label for="regions3" class="form-check-label">제주</label> <input type="checkbox" value="JEJU" class="form-check-input" id="regions3" name="regions"><input type="hidden" name="_regions" value="on"/> </div> </div> 세부 과정을 보면 다음과 같습니다. public String next(Object id) { Validate.notNull(id, "ID cannot be null"); String str = id.toString(); return str + this.context.getIdentifierSequences().getNextIDSeq(str); } next()는 IdentifierSequences 의 getNextIDSeq() 를 통해 count 정보를 얻습니다. public Integer getNextIDSeq(String id) { Validate.notNull(id, "ID cannot be null"); Integer count = (Integer)this.idCounts.get(id); if (count == null) { count = 1; } return count; } getNextIDSeq() 를 보면, idCounts에 id가 없는 경우 1을 반환합니다. 즉, 처음에 #ids.next(’regions’) 가 입력되면, getNextIDSeq() 는 1을 반환하기에 첫 번째 label은 for=’regions1’ 이 됩니다. 다음 과정은 2번 문단에 적은 세부 과정과 동일한데, 이전의 #ids.prev에서와 달리 #ids.next는 count에 1을 뺀 값이 아닌 count 그대로 를 반환하므로, #ids.prev를 사용할 때와 같이 for와 id가 일치된다고 생각할 수 있습니다. 읽어주셔서 감사드립니다. 새해 복 많이 받으세요!(질문 작성일이 설 당일이라.. 겸사겸사 인사드립니다!)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 7:56에서 하신 테스트를 실행했을 때 강의에서는 정상적으로 동작했지만 저는 오류 발생하며 테스트가 정상적으로 되지 않습니다. 오류 로그 테스트 코드에서 item3이 무슨 이유인지 모르지만 같이 넘어가서 문제가 되는 것으로 보입니다. 왜 이럴까요?