Golang 에서 Postgresql 접속시 익숙한 JDBC URI 방식으로 접속 정보를 쓰고 싶었는데, 패스워드에 특수문자가 있어서 제대로 접속이 안된다. 패스워드의 특수문자는 이스케이프 해서 사용하는 방법을 설명한다.
Go 에서 Postgresql 접속하기 
Go 에서 Postgresql 접속하는 방법을 검색하면 DB 접속 정보를 넣는 방법을 아래처럼 쓰고 있다.
		
		
			
			
				
					
				
					
				 
						db ,   err   : =   sql . Open ( "postgres" , 
     fmt . Sprintf ( "user=%s password=%s dbname=%s" ,   "postuser" ,   "8e3#*jXq_p,E" ,   "postdb" ) ) 
 
				
			 
		 
위 코드에서는 호스트, 포트를 지정하지 않는데, 기본값인 localhost, 5432를 사용할 때는 지정하지 않아도 된다. 아래 lib/pq 문서를 보면 기본값이 나와있다.
lib/pq 문서 – https://pkg.go.dev/github.com/lib/pq?tab=doc 
하지만, 고 어플리케이션을 항상 DB가 있는 서버에서 돌릴 것도 아니고, 호스트랑 포트만 써도 아래처럼 길어지게 된다.
		
		
			
			
				
					
				
					
				 
						db ,   err   : =   sql . Open ( "postgres" , 
     fmt . Sprintf ( "host=%s port=%d user=%s password=%s dbname=%s" ,   "192.168.0.4" ,   "5433" ,   "postuser" ,   "8e3#*jXq_p,E" ,   "postdb" ) ) 
 
				
			 
		 
난 간결한 URI 방식이 좋다. 다행히 lib/pq 문서에 보면 지원한단다. 바꿔서 써보자.
		
		
			
			
				
					
				
					
				 
						db ,   err   : =   sql . Open ( "postgres" , 
     "postgres://postuser:8e3#*jXq_p,E@192.168.0.4:5433/postdb" ) 
 
				
			 
		 
필요한 정보만 모아서 쓰니까 알아보기가 쉽다. 이게 잘 돌아가면 좋은데 말이지.
		
		
			
			
				
					
				
					
				 
						panic :   parse   "postgres://postuser:8e3" :   invalid  port   ":8e3"   after  host 
 
				
			 
		 
해결방법은 문제가 되는 패스워드를 이스케이프 처리하면 된다.
이스케이프 처리 
아래 특수문자를 퍼센트 인코딩하면 된다.Wikipedia Percent-encoding – https://en.wikipedia.org/wiki/Percent-encoding  
이스케이프한 패스워드는 아래처럼 된다.
		
		
			
			
				
					
				
					
				 
						db ,   err   : =   sql . Open ( "postgres" , 
     "postgres://postuser:8e3%23%2AjXq_p%2CE@192.168.0.4:5433/postdb" ) 
 
				
			 
		 
이걸로는 접속 안된다. 콤마는 이스케이프 안해도 되더라. 콤마는 그대로 둔 아래 코드로 접속에 성공했다.
		
			
			
				
					
				
					
				 
						db ,   err   : =   sql . Open ( "postgres" , 
     "postgres://postuser:8e3%23%2AjXq_p,E@192.168.0.4:5433/postdb" ) 
 
				
			 
		 
결론은 파싱에 방해가 되는 특수문자만 이스케이프 처리해 주면 되는듯하다.
여담 
자바에서도 같은 문제가 있나해서 해 봤는데 애초에 유저명과 패스워드는 URI 에 포함하지 않고 따로 입력하게 되어 있어서 이스케이프 처리 없이도 잘 접속 되더라.GOLANG POSTGRES 접속해서 필요없는 컬럼은 빼고 가져오기