이게 좀 회색 영역이군요. Parse는 ToString에서 나올 수 있는 출력 이상의 것을 Parse 하는 건 당연한 동작이긴 한 거 같아요. ToString은 normalize 된 깔끔한 스트링을 내 놓지만 Parse는 그 이상의 입력값도 받으니까요. 빈칸이 앞 뒤에 들어가 있다던지 소숫점이나 부동소수점 scientific notation 같은 것도 있고 해서 애매하지 않게 처리만 가능하면 파싱해 버리는 게 기본 동작인 거 같네요. 버그가 아니라 원래 그런 녀석이라고 이해하는 게 더 맞을 듯.
Enum의 Parse라는 함수 자체가 string 형태의 데이터를 분석해서 해당하는 Enum으로 변환시켜 주는 함수라는 걸 생각하면 "0"과 "East" 둘 다 파싱 되는 게 올바르게 동작하고 있는 것 아닌가 하는 생각은 드네요 제가 해당 함수를 만들었다고 생각해 봤을 때 고민은 하겠지만 그래도 보편적인 정의에 따라서 설계하고 나머지는 사용자에게 맡기는 게 더 좋은 방법이라 생각되어서 "0"도 파싱 되게 했을 것 같기도 하고요 다만 현업에서 실제로 enum을 저렇게 숫자로 그것도 굳이 string 형태로 serialize 하는 경우가 거의 없으니 실제적인 실효성은 거의 없고 특정 상황에서 버그를 유발할 수 있다는 건 동의합니다 결국 실제 사용 사례에 중점을 둘 건지, 아니면 논리/철학적인 정의에 중점을 둘 건지의 차이인 것 같아요 여담으로 실제 "0"으로 사용하고 있는 곳이 얼마나 되는지도 궁금하네요 워낙 기상천외한 코드들이 많으니
bnmy6581i 숫자 string이 파싱 된다고 해서 문제가 생기는 케이스가 크진 않을 것 같아서요 애초에 서버 개발자가 enum을 숫자 string으로 내려주거나 클라 쪽에서 같은 방식으로 올려주는 케이스는 그 개발자가 더 큰 문제이지 않을까요? 포프님이 말씀하신 데이터 변조의 경우에도 숫자를 파싱하지 않는다고 해도 유저가 다른 enum으로 변조가 가능하다면 숫자를 넣거나 다른 enum을 넣거나 어차피 같은 문제가 생기는 게 아닌가 하는 생각이 드는데 제가 놓치고 있는 부분이 있을까요?
재밌는 버그네요. 이전에 라이브에서도 질문한적 있긴한데 포프님의 c# 의 dynamic 키워드에 대한 생각도 들어보고 싶습니다. 저는 c#에서 json 받아서 사용할때 json이 타입이 명시되지 않아 dynamic 넣어서 처리하곤 했는데... dynamic에대한 생각이 궁금합니다 !
System.Text.Json 패키지에 있는 JsonSerializer 좋아요 Deserialize 메소드에서 T를 원하는 클래스로 구현하고 쓰시면 됩니다 클래스 만들기 귀찮으면 Visual Studio에서 편집 > 선택하여 붙여넣기 > JSON을 클래스로 붙여넣기 하시면 편합니다
@@포프티비 동작으로만 따지면 단순하기때문에 그렇게 판단할수도 있지만.. 저흰 자주 재사용되면 동작에 대한 의미를 부여해주는게 더 좋다고 생각합니다. 또한 메소드 파라미터에서 해당 enum에서 정의된 값 이외의 숫자형 string이 넘어온다면 예외로 처리할지 말지도 컨트롤 가능하잖아요?
언어따라 다른데... C++이란 가정하에 말씀드리면 제가 구조체를 쓰는 경우는 매우 한 정적입니다. 1. 곧바로 대입으로 값이 복사되어야할 때 2. 구조체의 메모리를 그대로 하드에 시리얼라이즈 디시리얼라이즈 할 때 3. 멀티스레딩 잡 시스템의 데이서로 전달하기 위해 데이터를 만들때 (data driven design, data oriented design) 개인적으로 필요에 따라 struct안에 함수 한 둘 넣는 건 크게 개의치 않아요.
결론: 주니어 개발자가 언어 명세를 읽어보지 않고 코드짜다 생긴 버그다
Aㅏ.. 나는 주니어
반박불가 틀린말은 아니내 ㅋㅋ
하지만 기능자체가 c++의 기본적인 메카니즘이 같기때문에 그럴겁니다. 이넘의 가장강력한 기능은 비트프래그 연산이라, 이것을 사용하기 위해서라도 중요한 부분이죠.
따봉 누른다고 진짜 주니어 되시는건 아니겠죠? ㅋ
이게 좀 회색 영역이군요. Parse는 ToString에서 나올 수 있는 출력 이상의 것을 Parse 하는 건 당연한 동작이긴 한 거 같아요. ToString은 normalize 된 깔끔한 스트링을 내 놓지만 Parse는 그 이상의 입력값도 받으니까요. 빈칸이 앞 뒤에 들어가 있다던지 소숫점이나 부동소수점 scientific notation 같은 것도 있고 해서 애매하지 않게 처리만 가능하면 파싱해 버리는 게 기본 동작인 거 같네요. 버그가 아니라 원래 그런 녀석이라고 이해하는 게 더 맞을 듯.
Enum 모르면 당신은 주니어
Enum의 Parse라는 함수 자체가 string 형태의 데이터를 분석해서 해당하는 Enum으로 변환시켜 주는 함수라는 걸 생각하면 "0"과 "East" 둘 다 파싱 되는 게 올바르게 동작하고 있는 것 아닌가 하는 생각은 드네요
제가 해당 함수를 만들었다고 생각해 봤을 때 고민은 하겠지만 그래도 보편적인 정의에 따라서 설계하고 나머지는 사용자에게 맡기는 게 더 좋은 방법이라 생각되어서 "0"도 파싱 되게 했을 것 같기도 하고요
다만 현업에서 실제로 enum을 저렇게 숫자로 그것도 굳이 string 형태로 serialize 하는 경우가 거의 없으니 실제적인 실효성은 거의 없고 특정 상황에서 버그를 유발할 수 있다는 건 동의합니다
결국 실제 사용 사례에 중점을 둘 건지, 아니면 논리/철학적인 정의에 중점을 둘 건지의 차이인 것 같아요
여담으로 실제 "0"으로 사용하고 있는 곳이 얼마나 되는지도 궁금하네요
워낙 기상천외한 코드들이 많으니
생각하게 만든 코드는 좋아보이지는 않군요 ㅎㅎ
bnmy6581i 숫자 string이 파싱 된다고 해서 문제가 생기는 케이스가 크진 않을 것 같아서요
애초에 서버 개발자가 enum을 숫자 string으로 내려주거나 클라 쪽에서 같은 방식으로 올려주는 케이스는 그 개발자가 더 큰 문제이지 않을까요?
포프님이 말씀하신 데이터 변조의 경우에도 숫자를 파싱하지 않는다고 해도 유저가 다른 enum으로 변조가 가능하다면 숫자를 넣거나 다른 enum을 넣거나 어차피 같은 문제가 생기는 게 아닌가 하는 생각이 드는데 제가 놓치고 있는 부분이 있을까요?
소중한 경험을 공유해주셔서 감사합니다
아 뒷목... 잠을 덜 잔건가, 그만큼 enum parse에 충격을 먹은건가...
결론: Document를 잘 읽고 사용해야 한다.
재밌는 버그네요. 이전에 라이브에서도 질문한적 있긴한데 포프님의 c# 의 dynamic 키워드에 대한 생각도 들어보고 싶습니다. 저는 c#에서 json 받아서 사용할때 json이 타입이 명시되지 않아 dynamic 넣어서 처리하곤 했는데... dynamic에대한 생각이 궁금합니다 !
System.Text.Json 패키지에 있는 JsonSerializer 좋아요
Deserialize 메소드에서 T를 원하는 클래스로 구현하고 쓰시면 됩니다
클래스 만들기 귀찮으면 Visual Studio에서 편집 > 선택하여 붙여넣기 > JSON을 클래스로 붙여넣기 하시면 편합니다
@@nortina2211 오와 json to class가 있어요? 대박
@nortina 그 방법도 생각해봤는데 제가 쓰는 json 은 추가되는 키나 삭제되는 키의 빈도가 많아 매번 class까지 같이 업뎃해줬어야했습니다. 그 당시 만들었던 tool은 이런 json을 일괄 편집하는 툴이었어서 그방법을 쓰기엔 좀 번거로웠네요.
전 dynamic 안쓰고 json마다 클래스를 만들어 씁니다. (사실 json을 클래스에서 뽑아내기도 하고요)
enum 멤버 이름이 숫자로 시작할수 없기때문에 허용하지 않았을까요 ㅎㅎ
그와는 별개로 명확성을 위해서라면 확장메서드로 Enum.TryParseFromValue, Enum.TryParseFromMember 만들어서 쓸거같습니다 ㅋㅋ
TryParseFromValue는 int parse한 뒤 형변환 하면 되는 거라 별도로 필요하진 않을 거 같아요
@@포프티비 동작으로만 따지면 단순하기때문에 그렇게 판단할수도 있지만.. 저흰 자주 재사용되면 동작에 대한 의미를 부여해주는게 더 좋다고 생각합니다. 또한 메소드 파라미터에서 해당 enum에서 정의된 값 이외의 숫자형 string이 넘어온다면 예외로 처리할지 말지도 컨트롤 가능하잖아요?
이런 영상 너무 기다리고 있었어요 ㅋ
자바도 언젠가 enum이 추가되었지만
자바는 static 맴버에 west문자열을 담아서
사용하는 방법도 있습니다.
다만 이넘의 장점인 비트프래그연산이
안되는 단점이 있죠.
이런문제가 있는건 처음 알았내요
영상 enum 파싱문제 내용만 때다가 따로들으면 쌩 javascript 내용인줄알겠네요😂 놀랍...
통상적으로 DB저장할때는 보통 INT형으로 저장하니까 String형을 Parse하는 것보다 더 자주 쓰이니 그렇게 결정한것 같네요. 위험성을 예측하고 외부에 노출되는것은 의도적으로 막은걸로 보입니다
Db에서 온건 곧바로 이넘으로 캐스팅해서 대입할거 같은데요.(실제 ef core도 그렇게 도는 거 같고)
오히려 이넘 parse를 써야할때는 도큐먼트(예: json)에서 디시리얼라이즈 할 때인거 같아요.
출근해서 C#쓰고 있었는데 바로 지식 하나 얻어갑니다..!
포프님이 사용하시는 함수 사용에 대한 규칙은 언급한적이 있는데, 클래스 사용에 대한 규칙도 존재한다면 알고싶습니다. 구조체와 함수만으로 사용하는경우와 클래스로 명시적으로 구조체와 함수를 결합시키는경우에 대한 규칙이 있으시다면 답변 부탁드려요!
언어따라 다른데...
C++이란 가정하에 말씀드리면 제가 구조체를 쓰는 경우는 매우 한 정적입니다.
1. 곧바로 대입으로 값이 복사되어야할 때
2. 구조체의 메모리를 그대로 하드에 시리얼라이즈 디시리얼라이즈 할 때
3. 멀티스레딩 잡 시스템의 데이서로 전달하기 위해 데이터를 만들때 (data driven design, data oriented design)
개인적으로 필요에 따라 struct안에 함수 한 둘 넣는 건 크게 개의치 않아요.
저도 쓸때 주의해야겠습니다~:^
enum은 좋은넘이다..
영상 주제랑 동떨어지는데 9월에 스페이스마린2가 나오는데 김포프님 생각나더라구요.
제 자식 같은 놈이죠....
이놈........음..ㅋㅋ, enum 귀찮아서 그냥 string쓰고 있긴 한데
Newtonsoft Json을 사용하지 않고, C# 빌트인을 사용하시나 보군요 😮
현재는 둘다 쓰는데 c# 빌트인으로 마이그레이션 중이에요.
누가 말해주던데
특정 언어에대한 불평과 욕이 많다면, 그 언어를 해야한다고 😂😂
그럼 Javascript 죠 ㅎㅎ
새로 구현하신 parse 는 그럼 잘못된 값, 숫자나 엉뚱한 문자열 값 이 들어오면 어떻게 반응하나요? null 이 되나요? 예외가 발생하나요?
Parse는 예외. TryParse는 false 반환. 이건 시샵에서 정형회된 패턴이죠. 널을 사용하지 않는.
참고로 enum은 value type이라 null이 될수 없어요
그럼 pocu 아카데미에도 위 내용이 반영될 예정인가요?
아뇨. 이런 자잘한 건 굳이 가르치지 않습니다.
이런거 너무 좋아요
괴상한 거 좋죠...(응?)
숨겨진 BABO!
Discriminated Union 추가 기원 🙏
enum 잘못쓰면 enum함 ㅋㅋ
세상에 모르고 있었어요
저도 시샵 오래썼는데 최근에야 알았죠. 🫠
@@포프티비 하나 또 배워갑니다 감사합니다
앤더스 해즐버그
에.. 이름에도 버그가....
의도가 아니라 잘못 만든 거일까요?
시샵 첨 나왔을땐 그 방식이 말이 되었다고 생각해요
저도 가끔 공부하다가 괴상한 포즈를 취하곤 하는데, 그게 전부 포프님을향한 막연한 사랑 때문일까요...
그럼요 🤎
c# 의 성별은 여성이었군요?
남성일지도...(응?)
이넘이 대단한넘 이군요
귀찮은 넘이기도 .