라벨이 MySQL인 게시물 표시

[MySQL EF 6] System.NotSupportedException: Unable to create a constant value of type [타입명] 예외 해결 방법

  해당 예외가 발생하는 이유는 여러가지가 있겠으나 이번에 제가 경험한 내용을 바탕으로 글을 쓰도록 하겠습니다. 이 방법으로 해결이 안 되는 분께선 구글신의 힘을 빌리도록 하시길 바랍니다. 잘못된 비교 로직   여기 3개의 기본 키를 포함한 원시 타입과 1개의 외래 키 객체를 지니는 모델이 있습니다. public class ExampleModel { [Key] public int Id { get; set; } public decimal UpperLimitPrice { get; set; } public decimal MaximumPrice { get; set; } public UserModel User { get; set; } }   그리고 우리는 수많은 Example 중에서 특정 User 와 일치하는 레코드를 가져오고자 합니다. 직관적인 예를 들면, 게시판이 있는 웹 서비스에서 '내 글 보기'와 같은 기능을 구현 한다고 생각하시면 편합니다.   이때, 아래와 같이 코딩을 하면 이 포스트의 제목과 같은 예외가 발생하게 됩니다. _context.ExampleList.Where(ex => ex.User == userClient);   왜일까요? 이유는 바로 EF에서 원시 타입이 아닌 객체의 비교를 지원하지 않기 때문 입니다. 즉, string, int, long, float, double, decimal, ... 이런 타입이라면 비교가 가능하지만, 사용자가 직접 만든 클래스의 객체, 여기선 UserModel의 객체에 대한 비교는 지원하지 않는다는 것이죠.   이유를 생각해보면 간단합니다. 우리가 SQL로 SELECT 쿼리를 날릴 때, 예를 들어 게시판에서 특정 유저가 쓴 글의 레코드만 가져온다고 하면 SELECT id, title, body, registeredDate FROM board WHERE userId = '[외래 키로 연결된 유저 테이...

[MySql] 연결 문자열에서 타임존 설정

  Spring MVC 작업 중 아래와 같은 에러가 발생했습니다. CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The server time zone value    context-datasource.xml에 연결 문자열에 serverTimezone을 설정하라고 스택오버플로우에서 말하더군요. 문제는 timezone을 뭐로 설정해야하는가? 였습니다.   우선 첫 번째로, 서버에서 사용중인 타임존을 알아야겠죠? SELECT @@global.time_zone, @@session.time_zone;   위와 같이 쿼리를 날렸더니, 둘 다 SYSTEM이란 답만 돌아왔습니다. 그래서 아래와 같이 해봤습니다. SELECT timediff(curtime(), utc_time());   결과는 09:00:00 였습니다. 서울이죠. 그래서 serverTimezone=Seoul 이라고 했더니 안 되더라고요. 구글로 검색해본 결과 앞에 대륙명까지 적어야 한다는 것을 깨달았습니다. 참고: 위키피디아   serverTimezone=Asia/Seoul 로 설정하니 정상 작동되는 것을 확인했습니다.

MySQL Workbench SafeMode 해제 방법

이미지
  MySQL 워크벤치에서 DELETE, UPDATE문을 WHERE절 없이 실행하려 할 때 실행이 되지 않은 채 세이프모드를 해제하라는 경고가 나타날 경우 해결하는 방법입니다.   우선 Edit  -> Preferences  메뉴를 차례로 클릭해 환경설정 다이얼로그를 띄워주세요.   SQLEditor  섹션의 맨 아래, Safe Updates 체크박스의 체크를 해제 해주세요.   Workbench를 재시작 해주세요.   끝입니다. 참 쉽죠? 이제 DELETE, UPDATE문을 제약 조건 없이 실행해도 더이상 거부당하지 않습니다. 주의사항   위 방법을 실행할 경우, UPDATE, DELETE문에 WHERE절이 빠져도 경고 없이 실행 됩니다. 이것이 의미하는 바는, 실수로 WHERE절을 빠뜨린 채 실행해도 되돌릴 방법이 없어진다 는 것입니다.   DELETE문 같은 경우는 그 특성상 실수할 일이 적으나, UPDATE문같은 경우 실수로 마지막에 WHERE절을 빼먹는 경우가 심심찮게 발생할 수 있으므로, Safe Mode를 해제하고 작업할 경우 이 점을 반드시 잊지 말아야 합니다.   특수한 경우가 아닌 이상 세이프 모드를 켜놓고 제약 조건을 정확히 명시하는 것을 추천 드립니다. 여기서 특수한 경우란, 어느 한 테이블의 모든 행을 삭제해야 하는데, 특정할 만한 컬럼이 없는 경우 등  WHERE절을 쓸 수 없는 상황입니다.   특정할 만한 컬럼이 있는 경우, 예를 들어 auto-increment되는 id 컬럼이 있다면 아래와 같이 써서 모든 레코드를 지울 수 있습니다. DELETE FROM table_name WHERE id > 0;   그러므로 정말 특수한 경우가 아니라면, 세이프 모드는 켜두시는 것을 권장합니다.

[MySQL] Your password does not satisfy the current policy requirements 문제 발생시 해결 방법

1. 루트 권한으로 validate_password 플러그인 삭제 UNINSTALL PLUGIN validate_password; 복구할 경우 INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 2. my.cnf에서 validate_password 플러그인 설정 조절 // my.cnf validate_password_policy=LOW // tty (ubuntu) sudo service mysql restart // tty (centos) sudo service mysqld restart

[MySQL] 유저 목록 확인하는 방법

USE mysql SELECT User, Host, Password FROM user; 참고: https://www.rosehosting.com/blog/mysql-show-users/

[MySQL] 데이터 디렉터리를 변경하는 방법

이미지
  한 달 전, 포맷이 필요해 포맷을 하다가 실수로 MySQL 데이터를 백업하지 않아 전부 날려버린 아픈 기억이 있습니다. 사실 더 전에도 여러번 이런 적이 있는데, 그 때마다 데이터 디렉터리 변경하는 방법을 알아봐야지~ 하고서는 포맷이 끝나고 기존 어플리케이션들을 다 재설치할 때 쯤 까먹고 또 날려버리는 멍청한 짓을 반복해왔죠.   하지만 한 달 전 날린 데이터는 정말 굉장히 소중한(= 돈에 직결되는) 데이터였기에 충격이 커서 포맷 완료 후 MySQL을 재설치할 때까지 잊지 않고 데이터 디렉터리를 변경하겠다는 마음가짐을 유지할 수 있었죠.   아무튼, 이 포스트는 그런 아픈 기억에서 시작한 MySQL Data Directory를 변경하는 방법 에 대한 글입니다. MySQL Data Directory 변경하기 MySQL 서비스 중지   일단 MySQL 서비스를 중지해야 합니다. Windows 키 + R 을 눌러 실행 창을 띄운 뒤, services.msc 를 입력해 서비스 관리자를 열어주세요.   그 후, MySQL을 설치할 때 입력한 MySQL 서비스를 찾아 중지해주세요. 기본값은 MySQL[버전](예: MySQL57) 입니다. my.ini 수정하기   이제 my.ini의 datadir를 수정할 차례입니다. 마찬가지로, 시작 - 실행에 %PROGRAMDATA%\MySQL 을 입력해 폴더를 연 뒤, MySQL Server [VERSION] (예: MySQL Server 5.7) 폴더 에 들어가 my.ini 를 관리자 권한의 에디터 로 열어주세요.   그리고 스크롤을 내리다 보면, datadir 라는 프로퍼티가 보일 겁니다. (별다른 설정을 하지 않고 설치를 진행한 분의 경우 96번째 줄)   이 프로퍼티의 경로를 원하는 디렉터리로 수정해주세요. 당연히 디렉터리는 만들어져있어야 하며, 백슬래시(\) 대신 슬래시(/)를 사용하세...