Newtonsoft.Json.JsonReaderException:
Unexpected character encountered while parsing value: n. Path '', line 0, position 0.
위치: Newtonsoft.Json.JsonTextReader.ParseValue()
위치: Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
위치: Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
위치: Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
위치: Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
위치: Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
위치: Docker.Engines.WSL2.LinuxWSL2Engine.<DoStartAsync>d__9.MoveNext() 파일 C:\workspaces\4.21.x\src\github.com\docker\pinata\win\src\Docker.Engines\WSL2\LinuxWSL2Engine.cs:줄 57
--- 예외가 throw된 이전 위치의 스택 추적 끝 ---
위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
위치: Docker.ApiServices.StateMachines.TaskExtensions.<WrapAsyncInCancellationException>d__0.MoveNext() 파일 C:\workspaces\4.21.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:줄 29
--- 예외가 throw된 이전 위치의 스택 추적 끝 ---
위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
위치: Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__7.MoveNext() 파일 C:\workspaces\4.21.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:줄 79
--- 예외가 throw된 이전 위치의 스택 추적 끝 ---
위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
위치: Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__7.MoveNext() 파일 C:\workspaces\4.21.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:줄 108
--- 예외가 throw된 이전 위치의 스택 추적 끝 ---
위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
위치: Docker.ApiServices.StateMachines.EngineStateMachine.<StartAsync>d__17.MoveNext() 파일 C:\workspaces\4.21.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\EngineStateMachine.cs:줄 97
--- 예외가 throw된 이전 위치의 스택 추적 끝 ---
위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
위치: Docker.Engines.Engines.<StartAsync>d__23.MoveNext() 파일 C:\workspaces\4.21.x\src\github.com\docker\pinata\win\src\Docker.Engines\Engines.cs:줄 122
진짜 가관이다 ..
나는 그저 실습을 위해서 Docker를 설치하고 싶었을 뿐인데 ..
exe 파일도 download가 잘 되었고, exe 파일을 열어서 설치까지 잘 되었는데,
Docker를 실행하려고 열어보니 저런 오류가 발생했다.
나는 잘못한게 없고, 그냥 시키는대로 따라가면서 설치만 했을 뿐이라구요 ㅠㅠ 뭘 잘못했는데 ..
오류 내용에 Json을 읽는 것에 문제가 있다고 한 것 같아서 파일을 찾아보려 했으나 실패했다.
그래서 오류 내용을 검색해봤는데,,
WSL의 설치 여부나, 버전의 문제라고 해서 그럼 그걸 고쳐봐야겠다 ! 하고 야심차게 cmd를 열어서 실행했다.
AWS 때문에 살펴보니, 이미 wsl이 있어서 그럼 update만 해주면 되겠구나 ! 하고 update 문을 실행했는데 ... 음..! 안된다 !
wsl -l -v
이 명령어를 통해서 설치되어 있는 wsl의 버전을 확인할 수 있다길래 실행해봤으나 실패.
cmd에서 안되면 power shell에서 해보라길래 똑같이 실행했으나 되지 않았다.
와 그러면 혹시 설치부터 다시 해야되나..? 해서 속는 셈 치고 설치부터 해보기로 했다.
wsl --install
어..? 설치가 되네 .. 그럼 버전을 업그레이드 해볼까?
wsl --set-default-version 2
된다 ..^^ 된다 ..
여기까지 실행하고 다시 docker를 실행해보니 연결이 됐다 ..
Docker를 설치하기 전에, 작업 관리자에서 성능의 가상화가 사용 상태가 되어 있어야 한다고 한다.
그리고 wsl이 꼭 설치가 되어있어야 한ㄷㅏ..
새롭게 docker를 설치하는 경우라면, wsl도 최신 버전으로 업데이트 해두어야 한다 !
나같이 오류로 1시간 고생하고 싶지 않다면 ... ㅠㅠ
라이브러리가 필요해서 build.gradle에 추가했다.
testCompileClasspath '라이브러리'
이렇게 하고 실행했는데 오류가 났다 ..! 아니 왜지 ??
A problem occurred evaluating root project 'jpa'.
> Dependencies can not be declared against the `testCompileClasspath` configuration.
나는 코드 그대로 갖고온건데 ,, 라이브러리를 잘못 입력했나 싶어서 봤더니 그건 아니었다.
(그대로 복붙한거라 그럴 수 없었다 ..)
해당 오류에 대한 내용을 검색해보았다.
해당 오류는 testCompileClasspath 구성(configuration)에 대해서 의존성(dependency)을 선언할 수 없다는 것을 의미.
testCompileClasspath는 테스트 코드를 컴파일하고 실행하는 데에 사용되는 구성으로, 테스트에 필요한 라이브러리들이 해당 구성으로 포함됨.
따라서 해당 testCompileClasspath 대신에 testImplementation을 사용해야 한다고 한다.
testImplementation은 테스트 코드에서 사용하는 라이브러리들에 대한 의존성을 선언하는 데에 사용된다.
testCompileClasspath와 testImplementation을 알게 되었다.
무의식적으로 testImplementation만 사용해왔어서 testCompileClasspath 라는 명령어로 되어있는지 몰랐다.
testCompileClasspath
- 테스트 코드를 컴파일하고 실행하는 데 필요한 라이브러리를 포함
- 테스트 소스 코드가 컴파일되고 테스트를 실행하는 데 필요한 의존성들을 여기에 선언함
- 테스트 코드를 컴파일 할 때만 필요하고 실제 프로덕션 코드를 컴파일하는 데는 사용되지 않음
- Gradle 4.6 버전 이전에 사용하던 명령어
testImplementation
- 테스트 코드를 작성하는 데 필요한 라이브러리를 포함
- 테스트 코드에서 사용하는 의존성을 선언할 때 이 구성을 사용
- 테스트 코드를 작성할 때만 필요하며, 실제 테스트 코드를 실행할 때는 사용되지 않음
- Gradle 4.6 버전 이후에 사용하는 명령어
testCompileClasspath | testImplementation |
---|---|
테스트 코드 컴파일 및 실행에 필요한 의존성을 선언하는 데 사용 | 테스트 코드에서 사용하는 라이브러리를 선언하는 데 사용 |
사용자로부터 입력받은 문자열과, 필드에 미리 선언되어 있던(혹은 DB에 저장되어 있던) 문자열을 비교하려고 할 때 .equals() 메소드를 사용하고는 했다.
.equals()를 사용하면, 각 문자열의 주소값이 아니라 안의 데이터들을 직접 비교해주니까 ..!
그래서 문자열 비교를 할 때는 무조건 .equals() 메소드를 사용했다.
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
s2 = "문자열";
if (s1.equals(s2)) {
System.out.println("같아");
} else {
System.out.println("달라");
}
이런식으로 사용했었다 !
문자열 비교가 그랬으니 .. 당연히 Object를 비교할 때도 같을 거라고 생각했다.
그런데 아니었다 ..
원하는 형태가 있어서 객체끼리 비교해봤는데, 같은 객체였는데 비교가 되지 않았다 !! 이유가뭐지 ?!
알고보니 Object의 equals()는 주소값을 비교하는 것이었다..
Object 비교의 .equals() 메소드
public boolean equals(Object obj) {
return (this == obj);
}
String 비교의 .equals() 메소드
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}