소개
게시글
질문&답변
2024.10.14
스프링 알림 1:N 발송 어떻게 구현해야할까요?
제 생각에는, n대1로 모든 대상에 대한 알림을 제어하는 것이 불가능하다고 생각합니다. 읽은 메세지와 읽지 않는 메세지를 구분 하려면, 그 status를 서버측에서 소유해야 하고 또 그것이 member 각각에 정해지는 터라, 각 member에 대한 insert는 불가피하다고 생각해요. 혹은 본래 notification과 member의 관계는 다대다인데, 확인이라는 관계를 두어 1대 다, 다 대1로 풀어가는 것은 어떨까요. 알림 자체는 한번으로 마무리 되나 확인이라는 관계를 통해 member의 확인 status를 저장할 수 있으니까요. 결론적으로는 결국은 member 수만큼 insert를 하긴 해야 상태에 따른 처리를 할 수 있지 않을까 생각합니다. 사실 뭐 데이터 베이스에 저장되는 양은 정말 많겠지만, 사실 테이블 컬럼수가 크지 않고 타입에 따른 데이터 크기가 작다면, 수가 많다 한들 그리 큰 문제가 아닐것 인데, 다만 io디스크를 많이 잡아먹는다면 그게 문제일 터라, redis를 활용한다던지, 또 저도 주워들은 것인데, 이런 구현에 rabbitmq인가 그런것들도 활용된다고 들었어요.
- 0
- 4
- 1.1K
질문&답변
2021.09.16
3:20 getchar()
scanf같은 입력함수들은 내부의 버퍼에 임으로 담겨졌다가, 사용시 끄집어내서 사용하는 방식입니다. 자세한 것은 입력함수들이 정의된 내용을 보아 동작방식을 알아야하나 이것은 너무 고급교육이고, 입력을 받을 때, int, float 등과 같은 숫자형은 '\n'자같은 개행문자들을 무시하고 출력하게 됩니다. 하지만 문자가 입력될때는 전혀 다른이야기가 되는데요, 보통 scanf 함수 쓰면서 앤터를 입력하시고 값을 입력하시는 경우가 있지요? 예를 들어서 char a; char b; scanf("%c",&a); scanf("%c",&b); 가 있을 때, 입력할때 a값 입력 - > 앤터 -> b값 입력 -> 앤터를 입력해보세요. b값은 입력을 받지않고 바로 넘어가게 될겁니다. 왜냐, 과정을 보면은 'a'를 입력했습니다. 버퍼 ㅣ 'a' | 그리고 앤터를 쳤습니다. 버퍼 | 'a' | | '\n' | 중요한 것은 변수 a에 'a'가 들어가게 되면서, 버퍼 |'\n'| 가 되는데 버퍼에 '\n' 개행문자가 남게 됩니다. 이것도 (char)형에선 문자죠. 그렇기 때문에 scanf의 b값 입력이 시작될 때, b값에 자동적으로 버퍼에 남은 '\n'이 들어가게 됩니다. 그래서 우리 눈에는 b값이 입력이 안된것 처럼 보일 뿐이죠. 실제론 a = 'a', b = '\n' 가 되버린 상황인 겁니다. 이것을 해결하기 위해선, 버퍼를 비우거나, 문자를 입력받는 getchar함수를 이용하는 겁니다. 버퍼를 비우는데는 fflush()같은 함수도 있지만 제가 알기론 공식 함수가 아닌것으로 알고(컴파일러에 따라 fllush가 작동 할 수 있고 안할수도 있음.), 그래서 getchar()를 쓰는데, getchar 함수는 입력한 문자 하나를 반환하는 형식입니다. int a = getchar(); 를 하면 문자하나가 a에 들어갈겁니다. 즉, char a; char b; scanf("%c",&a); getchar(); scanf("%c",&b); 아까와 같은 코드에서 getchar가 들어갔죠? 위의 문제가 되던 시점부터 보면, 버퍼 | 'a' | | '\n' | a에 'a'가 들어갑니다. 버퍼 | '\n' | 에서 getchar함수가 '\n'을 받습니다. 그러나 getchar()도 문자를 반환하지만 따로 저장할 변수를 마련하지 않아서 그냥 버려집니다. 버퍼 || 그럼 버퍼가 비워지고, scanf("%d",&b)가 실행됩니다. 비어져있기 때문에 자동으로 b값에 무언가 들어가지 않습니다. 이상태에서 입력해주면 정상적으로 b값에 들어갑니다.
- 1
- 2
- 328