반응형

🙅🏻‍♂️ 오류발생

Springboot와 JSP를 사용하는 과정에서 외부 리소스(로컬에 저장되어있는 이미지 파일)를 JSP의 <img> 태그의 src로 사용하려고 했는데, 경로를 잘 지정해줘도 x박스가 계속 뜨는 문제에 직면

 

기존에 사용하던 방법은 다음과 같습니다. application.yml에서 file에 대한 경로를 커스텀하기 위한 설정을 먼저 진행했습니다.

// application.yml

file:
  path: /User/username/IdealProjects/imageStorage

/User/username/IdealProjects/imageStorage 라는 경로에 있는 폴더에 이미지 파일을 저장하기 위해서 커스텀해놓은 것이다. 이렇게 application.yml에 넣어두면 @Value("${file.path}")로 어디서든 가져다 쓸 수 있다.

 

// Image.java

@Entity
public class Image {
    ...
    
    private String imageName;
    
    ...
}

내가 만들었던 Image 클래스에는 사진 파일이름을 저장할 수 있는 imageName이라는 필드가 존재한다. 예를 들어 사진 파일이름이 A.jpg라고 하면, 위에 설정된 경로인 /User/username/IdealProjects/imageStorage에 A.jpg를 저장한다.

 

이제 이 Image를 사용하고자하는 photo.jsp에서 사용하기 위한 Controller 작업을 해줬습니다.

// ImageController.java

@Controller
public class ImageController {
    @GetMapping("/photo/{id}")
    public String photo(@PathVariable int id, Model model) {
        Image img = imageRepository.findById(id).orElseThrow(() -> {
            throw new CustomException("찾으려는 파일은 존재하지 않습니다.");
        });
        
        model.addAttribute("image", img);
        
        return "photo";
    }
}

가져 오려는 사진을 Repository에서 찾아서 Model에 넣어서 photo.jsp에서 사용할 수 있게 전달해줬습니다.

 

이제 photo.jsp에서 /User/username/IdealProjects/imageStorage/{이미지 파일 이름} 이라는 경로를 src에 넣어주면 된다. 하지만 이미지 파일을 가져올 때 사용되는 앞 부분 경로는 우리가 이미 앞에 application.yml에 설정해놨기 때문에 이를 스프링에서 사용할 수 있도록 WebConfig를 사용해줄 수 있다.

 

// WebMvcConfig.java

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Value("${file.path}")
    private String filePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        WebMvcConfigurer.super.addResourceHandlers(registry);

        registry
                .addResourceHandler("/image/**")
                .addResourceLocations("file:///" + filePath);

    }
}

WebMvcConfigurer을 상속받으면 스프링 Web 설정파일로서 작동이 되고, @Configuration을 적어주면 IoC 컨테이너에 빈으로 등록해놓을 수 있다. 

 

이제 @Value("${file.path}")를 사용해서 application.yml에 있는 커스텀 파일 경로의 값을 filePath에 넣어준다. 이제 addResourceHandlers()를 오버라이딩하고, addResourceHandler("/image/**")를 써서 /image/ 경로로 설정된 요청이 온다면, addResourceLocations("file:///" + filePath)를 써서 "file:///User/username/IdealProjects/imageStorage"로 바꿔서 작동된다는 설정이다.

 

이제 설정은 끝났으니 photo.jsp에서 이미지 파일을 사용해보자.

// photo.jsp
...

<img src="/image/${image.imageName}" />

...

로컬에 있는 파일을 가져오기 위해서 위와 같이 src 경로를 넣어줬습니다. 근데 사진은 x 박스 쳐지면서 가져오질 리소스를 가져오지 못했다. 찾아보니 보안상으로 웹 브라우저에서 로컬 리소스에 Get 요청을 할 수 없다는 거 같다는 내용이 많이 보였다. 자세한 원인을 찾고 싶었는데 아직 찾지 못했다... 만약 어쩌다 이 글을 읽게되시는 고수분이 있으면 알려주셨으면 좋겠다.

 

 

 

🙆🏻‍♂️ 문제해결

jsp에서 외부 리소스를 사용하기 위해서 구글링하다 해답을 찾았다. 스프링 태그 라이브러리(tglibs)를 사용하는 것이다. 먼저 jsp의 Header에 다음 코드를 추가한다.

// photo.jsp

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

...

spring이라는 prefix로 해당 기능을 사용할 수 있게되었다. 이제 이 <spring:>태그로 위에서 설정해줬던 url을 수정해볼 것이다.

 

// photo.jsp
...

<img src="<spring:url value='/image/${image.imageName}' />" />

...

이렇게 <spring:url />로 Url을 재설정해주니 사진이 정상적으로 가져와지는 것을 확인할 수 있었다.

반응형
반응형

🙅🏻‍♂️ 오류 발생

지금까지 DB를 쓸 때는 항상 MySQL을 사용했었다. MySQL은 Homebrew를 통해서 다운로드 했고, 새로운 프로젝트 연습을 위해서 MariaDB를 사용해보려고 했다. 그래서 MariaDB를 다운로드 받는 방법을 따라서 다운로드 했고, 다운로드 완료 후 MariaDB 실행 과정에서 해당 오류가 발생했다.

ERROR 2002 (HY000): Can't connect to local server through socket '/tmp/mysql.sock'

예전에 내 노트북은 아니고, 친구 노트북에서 해당 오류를 접했던적이 있었다. /tmp/mysql.sock 문제는 원인이 매우 많다고 한다. 그때는 뭔가 이것저것 다 건들다가 결국 안돼서 노트북을 그냥 밀어버렸던 기억이 있다. 

 

 

 

🙆🏻‍♂️ 해결과정

내가 해결했던 과정을 기록해보려고 한다. 발생 원인에 따라서 다를 수도 있으니 한번 글을 모두 읽고나서 따라해보는 것을 추천한다. 따라갔다가 돌아올 수 없는 길을 건널 수도 있으니...

 

 

1. MySQL 삭제

일단 생각했던 건 MySQL과 MariaDB가 둘다 같은 포트번호인 3306 포트를 사용한다고 한다. 그러니깐 MySQL과 MariaDB를 모두 삭제하고 다시 깔아보자는 생각을 했다. 아래에 기록하는 과정은 Homebrew를 통해서 다운로드한 경우에만 가능합니다.

# MySQL이 brew services에서 실행 중이라면
> brew services stop mysql
# homebrew에서 mysql 삭제
> brew uninstall mysql

 

 

2. MariaDB 삭제

# MariaDb가 brew services에서 실행 중이라면
> brew services stop mariadb
# homebrew에서 mariaDB 삭제
> brew uninstall mariadb
> brew cleanup

 

 

3. MySQL, MariaDB와 관련된 파일 모두 삭제

여러 게시글에서 finder에 직접 mysql, mariadb를 검색해서 찾아서 삭제하라고 하는데, 제 노트북에는 많은 프로젝트 파일들이 있어서 해당 파일에 mysql 관련된 파일이 너무 많아서 분류할 수 없었습니다. 그래서 경로로 타고 들어가서 직접 디렉터리와 파일을 삭제했습니다.

 

m1칩과 intel 칩 Mac book이 homebrew 사용 시 다운로드되는 경로가 다르다고 알고있습니다. 저는 m1칩 기준으로 설명했기 때문에 경로는 구글링으로 자세하게 찾아본 후 해보시기 바랍니다.

 

# my.cnf 관련된 파일 모두 삭제하기

 

/opt/homebrew/etc

 

위 폴더의 경로는 다음과 같다. "/opt/homebrew/etc" 터미널이 편하다면 해당 경로로 가서 커멘드로 삭제해줘도 된다. 근데 세상에 마우스로 누르는거보다 커멘드가 편한 사람이 몇이나 있을까 🥲

 

이제 관련된 파일이라는 것은 my.cnf가 포함된 파일, 폴더는 다 삭제해주면 된다. 예를 들어 위 폴더에는 "my.cnf", "my.cnf.d", "my.cnf.default"가 있다. 제 폴더에 있는 파일과 다를 수도 있으니 my.cnf가 들어가있는 파일, 폴더를 모두 삭제해줍니다.

 

맥북에서 해당 경로로 이동하는건 생각보다 매우 쉽다. finder로 들어가서 왼쪽 위 상단에 "이동"이라는 메뉴가 있다. 누른 후 "폴더로 이동" 누르면 경로로 이동할 수 있다.

finder > 이동 > 폴더로 이동

 

# mySQL 관련 폴더 삭제하기

위에서 my.cnf 관련 파일을 모두 삭제했다면 다음 경로로 이동해줍니다. "/opt/homebrew/var" 이동해보면 mysql이라는 파일이 있는 것을 볼 수 있습니다. 음....나 mysql 삭제했는데 왜 아직 폴더가 남아있지..?라는 생각이 들겁니다.

/opt/homebrew/var

 

여기에 있는 mysql 폴더도 삭제해줍니다.

 

 

4. MiriaDB 설치하기

이제 Homebrew를 통해서 MariaDB를 설치해줍니다. 

# MariaDB 설치
> brew install mariadb
# MariaDB 설치 확인하기
> mariadb -V

설치 완료 후에 버전을 확인해보면 본인이 다운로드 받은 MariaDB의 버전을 확인할 수 있습니다. 저 같은 경우는 아래와 같이 뜹니다.

mariadb  Ver 15.1 Distrib 10.11.2-MariaDB, for osx10.18 (arm64) using  EditLine wrapper

 

이제 MariaDB가 설치되었으니 실행시켜 봅시다.

# Homebrew에서 MariaDB 서비스 시작
> brew services start mariadb
# Homebrew에서 실행 중인 서비스 확인하기
> brew services

brew services 결과 아래와 같이 뜨면 성공입니다!

Name    Status  User       File
mariadb started {본인의 맥북이름} ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist

기존에는 Status가 stopped 상태였는데 이제, started가 되었습니다! 이제 MariaDB에 접근이 되는지 확인해보면 끝입니다. 터미널에 아래와 같이 입력합니다.

# MariaDB 실행
> mariadb

실행되면 아래와 같이 터미널이 변합니다.

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.11.2-MariaDB Homebrew

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

이제 MariaDB가 정상적으로 실행됐습니다. 여기까지 확인했으면 이제 MariaDB 실행을 종료할 때는 exit라고 쳐주면 Bye 라는 문구가 나오면서 MariaDB가 종료됩니다.

반응형

+ Recent posts