go 설치(https://golang.org/dl/) 는 그냥 다운 받아서 설치하면 되는 것이라 큰 문제 없었다. 그리고 당연히 vscode 에는 go lang 관련 확장을 설치(https://code.visualstudio.com/docs/languages/go) 해야 하는데 이것도 큰 문제 없었다. 

 go 가 설치되면 자동으로 설정되는 환경 변수가 있는데, go 가 설치되어 있는 경로에 GOROOT 이라는 경로가 설정된다. 그리고 GOPATH 라는 환경변수에 go get 으로 설치하는 패키들이 설정된다.

https://github.com/golang-kr/golang-doc/wiki/Go-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

golang-kr/golang-doc

Korean Translation of golang.org/doc. Contribute to golang-kr/golang-doc development by creating an account on GitHub.

github.com

이 문서에 따르면 모든 Go 코드를 단일 workspace 에서 관리한다고 한다. 이게 이해하기 힘든 구조이다. 모든 프로젝트가 같은 패키지들을 공유한다는게 좀 그렇다. 사용해야만 하는 패키지 버전이 있는데, 그 버전을 선택하지 못한다는게 나에게는 납득하기 힘든 구조이다. (물론 virtualenv 가 나오기 전 python 도 이랬긴 했다. )

 그래서 virtualenv 같은게 있는지 찾아 봤는데, https://github.com/GetStream/vg 라는 프로젝트가 있다. 그런데 윈도우즈에서 어떻게 사용해야 하는지는 잘모르겠다. 

 그래서 여러 방법을 생각하다, GOPATH 는 환경변수라서 환경변수를 어떻게든 사용할 수 있을까라는 생각을 했다. 그리고 vscode go 확장 옵션 중 inferGopath 라는 옵션이 있다. 이 옵션을 키면 Gopath 값을 현재 workspace 로 덮어쓰는 기능이 있다. 그래서 아래와 같이 .vscode/settings.json 을 구성하게 되었다.

===== settings.json  ====
{
    "go.gopath": "${workspaceFolder}", // gopath 설정을 vscode 의 workspace 로 한다. 
    "go.inferGopath": true, // 이 옵션을 켜야 위의 설정이 먹히는 것 같다.
    "terminal.integrated.env.windows": {
        "GOPATH": "${workspaceFolder}" // windows 에서 vscode 프로그램 내 터미널을 GOPATH 환경 변수 변경
    },
    "terminal.integrated.env.osx": {
        "GOPATH": "${workspaceFolder}" // osx 에서 vscode 프로그램 내 터미널을 GOPATH 환경 변수 변경
    },
}
=======

대신 패키지를 설치하기 위해서는 꼭 vscode 프로그램 내 터미널을 사용해야 한다. 

그러나 이렇게 하면 독립적인 환경을 구축할 수는 있는데, workspace 를 git 그대로 설정하게 되면 패키지들도 git에 포함될 수 있다. gitignore 를 잘 설정해야 할 것 같다. 

그리고 패키지를 이렇게 수동으로 설정해야 하는지 잘모르겠다. python 처럼 requirements.txt 파일로 pip 로 빠르게 설지하면 좋을 것 같은데, 아직 이런 방법은 잘 모르겠다. 

 개인적으로 ajax 로 get 이나 post 를 할 때는 modal 형태의 progressive 를 사용한다. 

modal 창이 뜬 상태에서 ajax 를 사용하게 되면 modal 이 중복되는 경우가 발생한다. 

이 때 z-index 때문에 문제가 생기는 경우가 있는데 아래 링크 처럼 z-index 를 잘 조절하면 문제가 해결된다. 

http://jsfiddle.net/likhi1/wtj6nacd/


핵심 코드는 아래와 같다.

$(document).on({

    'show.bs.modal': function() {

      var zIndex = 1040 + (10 * $('.modal:visible').length);

      $(this).css('z-index', zIndex);

      setTimeout(function() {

        $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');

      }, 0);

    },

    'hidden.bs.modal': function() {

      if ($('.modal:visible').length > 0) {

        // restore the modal-open class to the body element, so that scrolling works

        // properly after de-stacking a modal.

        setTimeout(function() {

          $(document.body).addClass('modal-open');

        }, 0);

      }

    }

  }, '.modal'); 




오래전에 교수님이 시켜서 섰던 글을 옮겨 둡니다.

아래 내용대로 하더라도 안되었던 것으로 기억합니다. UTF8 과 EUC_KR 사의 문제가 있었던 것 같은데, 기억이 가물가물하군요... 나중에(언제가될지 모르겠지만, ) 시간이 나면 다시 정리 할께요... 


--------------------------------------


다음은 수업시간에 교수님이 저를 꼭 집어서 시켜서 제가 작성한 것 입니다. 도움이 될 까 하고 여기에 올려봅니다.



JDBC 에 대한 설명을 수업시간에 들어서 다 아실거라 믿습니다. 다시 조금 설명하면 Java와 DB의 연결점이라고 생각하시면 됩니다. DB 마다 조금씩 SQL명령구문이 다릅니다. 다른 DB를 사용한다고 해서 SQL명령이 들어간 부분을 완전히 바꾼다고 한다면 보수유지에 문제가 많겠지요. 그래서 통일성있게 하려고 JDBC를 사용합니다. 


  JDBC를 사용할려면 우선 자바 JDK가 깔려있어야 하겠고 또 DB에 맞는 JDBC Driver가 필요합니다. 우리의 목표는 MySQL과 자바의 연결이니 MySQL에서 제공하는 JDBC Driver 가 필요합니다.  http://www.mysql.com/downloads/api-jdbc.html  이 주소를 따라가면 MySQL의 JDBC 드라이버를 받을 수 있습니다.


   다운 받을 때 버전 번호 잘 확인 하기 바랍니다. 버전 번호에 대한 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions.html  에 있습니다. 이 내용은 JDBC버전과 Mysql 의 관계를 설명한것입니다.  저의 엉터리 영어 해석을 동원하자먄 Connector/J 3.0 버전은 MySQL 3.x or MySQL 4.1 servers(버전뒤에 servers 가 붙는 것은 뭔지 모르겠습니다.) 에서 동작하고 , Connector/J 3.1 는 MySQL 4.1 and MySQL 5.0 servers 에서 동작하고, Connector/J 5.0  는  Connector/J 3.1의 기능에 뭔가를 추가했다는 말 같습니다.
  여기에 우리는 자바 가상머신 버전과 Connector/J 의 버전도 고려해야 합니다. 그 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions-java.html 여기에 있습니다. 자바 1.5이상을 쓰시면 그 다지 걱정하지 않아도 될 것 같군요..


  그냥 zip 파일이기 때문에 압축해제 하고 싶은데 하시기 바랍니다. 이 디렉토리(폴더)안에는 mysql-connector-java-[ver]-bin.jar 이런 형식의 jar 파일이 있습니다. 이 파일의 총 경로(디렉토리주소\파일이름)를 CLASSPATH라는 환경변수에 이 디렉토리를 설정하기 바랍니다. (CLASSPATH 에 추가 하는 것은 다 아시리라 믿습니다. PATH에 설정하듯이 설정하면 됩니다. CLASSPATH라는 환경변수가 없으면 만들고, 있으면 세미콜론 하나 붙인 후 이 패스를 추가 하면됩니다. )
 근데 이게 재부팅해야 작동하는 것 같습니다. 환경설정 자체는 재부팅이 필요없는데 JVM이 다시 로드되어서 작동하는 것 같습니다. 재부팅 안하고 하려면 mysql-connector-java-5.0.5-bin.jar 파일을 C:\Program Files\Java\jdk1.5.0_10\lib 라는 디렉토리에 넣으면 됩니다. 이게 더 좋은 방법일 것 같습니다.


 이제 잘 설정되었는지 실험해 보시기 바랍니다. 다음을 컴파일 한 후 실행해 보기 바랍니다.
===============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class jdbcTest {
 public static void main(String[] args) {
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
 }
}==================================================


 이 프로그램은 간단하게 Mysql과 연결하기 위해 드라이버를 로딩하는 기능을 합니다. 이게 제대로 실행되어야 합니다. 실행중 에러가 나면 안됩니다. 잘 작동하지 않는다면 대부분의 문제는 앞에서 설정을 잘못하였거나 자기 Mysql 버전과 맞지 않는 것을 사용했기 때문입니다.(저 같은 경우, 완전이 압축해제 하지 않아서 시간을 조금 허비했군요. 이 경우도 확인해 보시기 바랍니다.)


 이제 Mysql에 접속해 보겠습니다. 우선 mysql이 작동하는 상태로 만들고, 다음 코드를 컴파일 후 실행해 보기 바랍니다.
===================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class jdbcTest {
 public static void main(String[] args) {
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  try{
   Connection conn =
        DriverManager.getConnection("jdbc:mysql://localhost" ,"아이디" ,"패스워드");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }


 }
}
====================================================
 아이디와 패스워드 라고 중간에 한글로 된 부분은 진짜 자신의 아이디와 패스워드를 적어주시기 바랍니다.
 DriverManager.getConnection 메소드는 접근하기 위한 주소와 아이디, 패스워드를 받아 MySQL과 접속시켜줍니다. 만일 웹에서 작동하게 된다면 localhost 대신 자신의 웹주소를 적어야 하겠죠. 그리고 만일 Mysql을 처음 설치할 때 localhost로 안하고 다른 것으로 설정했다면 그 주소로 해야 합니다. 에러가 안 나와야 정상입니다.




 이제 쿼리를 날려봅시다.
==============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;


public class jdbcTest {
 public static void main(String[] args) {
 
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
 
  Connection conn = null;
  try{
   conn =
        DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }
 
  Statement stmt = null;
  ResultSet rs = null;
  try{
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT version()");
 
   // or alternatively, if you don't know ahead of time that
   // the query will be a SELECT...
 
   if (stmt.execute("SELECT versoin()")) {
    rs = stmt.getResultSet();
   }
  } catch(Exception ex) {
   // handle the error
  }



 }
}
================================================================
 쿼 리만 날려 봤습니다. SELECT versoin()은 SQL 버전을 출력해 주는 구문입니다. 우리의 결과는 rs에 들어 있습니다.이 자료를 출력하겠습니다. 우선 mytest 데이터베이스에 test라는 테이블을 만들어서 다음과 같이 자료를 넣었습니다. 우선 Database를 만들어 주어야 합니다.
create database mytest;
그 다음 테이블을 만들어 주어야 합니다. 다음과 같이 하면 됩니다.


CREATE TABLE  `mytest`.`test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) character set utf8 NOT NULL,
  `age` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
);


그리고 그 안의 데이터는 다음과 같습니다.
1 김철수 19
2 이영희 25
3 홍길동 43


 insert into 를 이용하는 것은 다 아시겠죠..


================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.sql.CallableStatement;


public class jdbcTest {
 public static void main(String[] args) {
 
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
 
  Connection conn = null;
  try{
   conn =
        DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }
 
  Statement stmt = null;
  ResultSet rs = null;
  try{
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT * FROM mytest.test");
 
   // or alternatively, if you don't know ahead of time that
   // the query will be a SELECT...
 
   if (stmt.execute("SELECT * FROM mytest.test")) {
    rs = stmt.getResultSet();
   }
  } catch(Exception ex) {
   // handle the error
  }
 
  try{
   while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");        
    int age = rs.getInt("age");
    System.out.println(id + " " + name + " " +age);
   }
  }catch(Exception ex) {
   // handle the error
  }
  }
 
}
================================================


 다음과 같은 결과가 나와야 합니다.
 
=====================
1 김철수 19
2 이영희 25
3 홍길동 43
====================




  MySql5.x 버전을 사용하면 한글이 깨져서 나올 수 있는데, MySQL Server Instance Config Wizard 라는 프로그램(MySQL 설치시 자동설치됩니다.)으로 환경설정을 다시 해주어야 합니다. 기본으로 하다기 Charracter set 을 설정하는 부분이 있는데, 맨 마지막 Manaul로 설정하고 Character set을 EucKR로 설정하세요.
그리고 테이블 삭제하고 다시 만들어서 실험해 보세요..


 여기 까지가 제 강의 입니다. 대부분의 자료는 http://dev.mysql.com/doc/refman/5.0/en/connector-j.htmlhttp://www.javastudy.co.kr/docs/lec_jdbc/index.shtml 에서 읽어보고 작동여부를 점검했습니다. 저기 있는대로 하니까 안되는 것도 있어 좀 고쳐서 했습니다.