1. form 양식에는 summit버튼만 누르면 name만으로 잘 controller에 전송이되는데 할꺼냐 말꺼냐 confirm할경우에 버튼의 속성을 summit아니고 단순 button으로 했더니 잘가던 네임값이 전송이 안되어서 추가했다.
function fn_detailUser(){
if(confirm(name + "님의 정보를 삭제하시겠습니까? 취소불가합니다.")){
let form = $("form");
var action_mode = $("<input>").attr("type", "hidden").attr("name", "action_mode").val("delete");
form.append(action_mode);
form.submit();
}
}
// 버튼 클릭 이벤트 처리 $("#but").on("click", function() { // 체크된 체크박스들의 3번째 칸 데이터 출력
$("input[name=poizon]:checked").each(function(index) { var $row = $(this).closest("tr"); // 체크된 체크박스가 속한 행 var thirdCellText = $row.find("td:nth-child(3)").text(); // 3번째 칸의 텍스트 조회 var thirdCellText = $row.find("td").eq(2).text(); // 3번째 칸의 텍스트 조회 console.log("선택된 2번째 칸 데이터: " + thirdCellText); });
var chose=$("input[name=poizon]:checked"); var tr_1 = chose.closest("tr"); var td_3 =tr_1.find("td:nth-child(3)").text(); console.log(td_3); });
each를 통하면 tr의 td값을 순서대로 출력도 가능함.
$("input[name=poizon]:checked").each(function () { var $row = $(this).closest("tr"); // 체크된 체크박스가 속한 행 var rowData = ""; // 행의 데이터를 저장할 변수 // 행의 각 셀 데이터를 조회하여 rowData에 추가합니다. $row.find("td").each(function () { rowData += $(this).text() + " | "; }); // 마지막에는 "|" 구분자를 제거하고 데이터를 출력합니다. console.log("선택된 행 데이터: " + rowData.slice(0, -3)); });
#라디오 버튼 선택시 해당 tr만 배경색 바꾸기....
$('input[name=poizon]').change(function() { var chose=$("input[name=poizon]:checked"); // Get the parent row of the radio var row = chose.closest('tr'); $('tr').css("background-color",""); row.css("background-color","gray"); });
1. 웹소켓을 통해 채팅 프로그램 만들기...1에서 왠만한건 다 복붙해서 이런건 감사...
2. 1:N 으로 적용해야합니다.
3. 저장은 DB로 해야하는데 이때 저는 REDIS를 알게 되었습니다. 그냥 활용해보기...
key, value값인데 뭘 어떻게 조회해야하나...여러 고민을 하였습니다. 첫번째 블로그만해도 금방 sysout프린트 되서 아~~~!!!너무 좋구나야 했는데 이걸 채팅룸에 비번 넣고 저장하고 불러오고 CRUD redis와 이런걸 하려니 너무 어렵더라구요. 이제부터 검색과 chatGPT(무료버전이라 오류가 좀 많아요)와의 싸움입니다... 기간은 2주였고 실제 작업한 일은 7일 정도입니다.
websocket 채팅 프로그램 코드등에 대해 정리합니다.
디자인 패턴을 꼼꼼히 맞춰서 만들지는 않았고 일단 빠른 진행을 목적으로 만들었으니깐 참고해주세요.
1. 웹소켓을 bean으로 설정하기 위해 파일도 만들었다 어쩌구 저쩌구 많은 고생을 했는데 결론은
@SpringBootApplication
public class Chat3Application {
/*웹소켓을 사용하기위해 설정한 Bean*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
public static void main(String[] args) {
SpringApplication.run(Chat3Application.class, args);
}
}
여기다 붙이는게 가장 좋았습니다. 이유는 @serverEndpoint 때문이였습니다. 이놈 붙은건 @기본생성자를 만들어야만 했기에 controller같은 파일은 만들어서 진행하기가 어려웠어요...왜냐?? DB저장해야하잖아요....기본로직을 따라가려니 잘 안되더라구요....3일째 여러 고생하다가 안착한 곳이...
@SpringBootApplication
붙은 Application 클래스였습니다. 에러안나는 곳은 여기 뿐이였어요.
2.
@Configuration
public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware {
/**
* Spring application context.
* ServerEndpoint 는 웹소켓에 의해 세션이 연결될때마다 인스턴스가 JWA 구현에 의해 생성되고 관리되기에
* 생성될때마다 의존성 주입을 할수 있도록 별도 설정이 필요
*/
private static volatile BeanFactory context;
@Override
public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
return context.getBean(clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
CustomSpringConfigurator.context = applicationContext;
}
}
redis설정....application.properties에는 기재내용은 검색해봐도 많이 넣을 필요 없이 심플심플하게..
#redis설정 == application.properties 파일에
spring.redis.host=localhost
spring.redis.port=6379
//별도로 Config 파일로 설정해주는데
//비번 설정을 안했기에 주석처리 했구요...
//tamplate메소드는 매핑처리하는데 필요, Serializer (JSON) 처리로 추가..
@EnableRedisRepositories
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
/* @Value("${spring.data.redis.password}")
private int password;
*/
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// Key Serializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
// Value Serializer (JSON)
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
// Hash Key Serializer
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash Value Serializer (JSON)
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return redisTemplate;
}
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
3. dto ..저는 채팅룸과 실제 채팅내용을 분리해서 만들었습니다.
timetoLive는 만료시간을 설정하는 속성으로 30으로 적어서 30초 후에 만료 및 조회되면 안되는데 조회됩니다.
검색결과redis폴더에서 redis.conf파일을 들어가서 maxmemory-policy를 volatile-lru 또는 volatile-ttl로 설정하라고 하는데....
1.불안함을 감추고 구글 cloud 가입해서 카드 등록 하고.(결제 맘대로 하지는 않는다고 하니깐...)
2.적용할...프로젝트 하나만들고
3.사용자 설정하고.
4. 이클립스에 라이브러리 설치하고,
5. 환경변수 별도로 해줘야 한다.
5. gradle. build에 설정하고.
6. java class하나 만들어서 실행해보기...젠장. 2일(4시간씩)이나 걸렸다....... 말이 왜이케 어렵냐....지들은 한방에 이해할지 모르겠지만.. 난정말.아무리 내가 개발 초자라고 해도 글치 뭔말을 이렇게 어렵게 해놨는지..이미지 보여주는 것도 라이브러리 관련해서 밖에 없고. 자료 검색해도 별로 안나오고 구글 나뻐.!!!!!!!!!
일단 나중에 또 구글 api를 써야 하기때문에 정리 하는 것임으로 부족해도 참고하시길....
에러 메세지io.grpc.StatusRuntimeException: PERMISSION_DENIED: Cloud IAM permission 'cloudtranslate.generalModels.predict' denied. 계속 발생
봤더니 가이드 문서에서 가져온 코드가 나하고 안맞는거였다..ㅠㅠ
import com.google.cloud.translate.Translate;
import com.google.cloud.translate.TranslateOptions;
import com.google.cloud.translate.Translation;
public class TranslateText {
public static void main(String... args) throws Exception {
// Instantiates a client
Translate translate = TranslateOptions.getDefaultInstance().getService();
// The text to translate
String text = "Hello, world!";
// Translates some text into Russian
Translation translation =
translate.translate(text, Translate.TranslateOption.targetLanguage("ru"));
System.out.printf("Text: %s%n", text);
System.out.printf("Translation: %s%n", translation.getTranslatedText());
}
}
ERROR in ch.qos.logback.core.joran.action.AppenderRefAction - Could not find an appender named [console]. Did you define it below instead of above in the configuration file?