Spring Uygulamasını Heroku ile Deploy Etmek

Merhabalar, bu yazımda Spring ile geliştirmiş olduğumuz bir uygulamayı Heroku’da nasıl deploy edebileceğimizi inceleyeceğiz. Öncelikle deploy edebilmek amacıyla basit bir Spring MVC projesi yazacağız ve bunu github üzerinde paylaşıp devamında da heroku üzerinde deploy alacağız.

 

Projemizi Oluşturalım

Projeyi bu sefer Spring Initialzr ile generate edelim. Seçeceğim bağımlılıklar ise bu şekilde olacak: Spring Web, Lombok, Data JPA, Thymeleaf ve H2. JDK için de 1.8 seçeceğim.

 

Kodları Yazalım

Basit ve hızlı bir anlatım oılması için bir adet Person sınıfı ve bunun controller’ını yazacağım. Sınıfımız içerisinde bulunacak instance variable’lar ise ; id, firstname,  lastname, email ve phoneNumber olacak. Ayrıca getter,setter ve constructor metodlarını lombok ile oluşturacağım.

Person sınıfımız:

@Getter
@Setter
@NoArgsConstructor
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String firstname;
    private String lastname;
    private String email;
    private String phoneNumber;

    public Person(String firstname, String lastname, String email, String phoneNumber) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
        this.phoneNumber = phoneNumber;
    }
}

 

Repository interface’imiz:

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
}

 

Controller içerisine ise findAll ve findById olmak üzere 2 adet @GetMapping ekliyorum. Veritabanına veri eklemeden verileri nereden çekeceğiz derseniz onlar için de CommandLineRunner kullanarak veritabanını populate edeceğim.

Controller sınıfımız:

@Controller
@RequestMapping("/")
@RequiredArgsConstructor
public class PersonController {

    private final PersonRepository personRepository;

    @GetMapping
    private String homePage() {
        return "index";
    }

    @GetMapping("/findAll")
    private String findAll(Model model) {
        model.addAttribute("personList", personRepository.findAll());
        return "findAll";
    }

    @GetMapping("/findById/{id}")
    private String findAll(@PathVariable long id, Model model) {
        Optional<Person> personOptional = personRepository.findById(id);

        if (personOptional.isPresent()) {
            model.addAttribute("person", personOptional.get());
        } else {
            model.addAttribute("person", new Person());
        }
        return "fingById";
    }
}

CommandLineRunner interface’ini implement eden bir DataLoader sınıfı oluşturalım. @RequiredArgs notasyonu sınıf içerisinde bulunan final değişkenler ile bir constructır oluşturuyor. Sınıf içerisinde tek bir constructor metodu olacağından bunu da @Autowire ile işaretlemesem dahi Spring benim yerime bunu yapıyor ve bu personRepository bean’imizi bizim için getiriyor ve initializate ediyor.

@RequiredArgsConstructor
@Component
public class DataLoader implements CommandLineRunner {

    private final PersonRepository personRepository;

    @Override
    public void run(String... args) throws Exception {
        personRepository.save(new Person("fName1", "lName1", "email1@codingbytime.com", "pNumber1"));
        personRepository.save(new Person("fName2", "lName2", "email2@codingbytime.com", "pNumber2"));
        personRepository.save(new Person("fName3", "lName3", "email3@codingbytime.com", "pNumber3"));
        personRepository.save(new Person("fName4", "lName4", "email4@codingbytime.com", "pNumber4"));
        personRepository.save(new Person("fName5", "lName5", "email5@codingbytime.com", "pNumber5"));
        personRepository.save(new Person("fName6", "lName6", "email6@codingbytime.com", "pNumber6"));
    }
}

 

Thymeleaf namespace’i içeren; index, findAll ve findById isminde 3 adet HTML dosyamızı resources/templates klasörü altında oluşturalım. Burada sadece findAll içerisinde kullandığım thymeleaf ile listeleme kısmını vereceğim.

<div class="table-responsive">
    <table class="table table-striped">
        <thead>
        <tr>
            <th scope="col">#</th>
            <th scope="col">First Name</th>
            <th scope="col">Last Name</th>
            <th scope="col">E-Mail</th>
            <th scope="col">Phone Number</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="person : ${personList}">
            <td th:text="${person.id}"></td>
            <td th:text="${person.firstname}"></td>
            <td th:text="${person.lastname}"></td>
            <td th:text="${person.email}"></td>
            <td th:text="${person.phoneNumber}"></td>
        </tr>
        </tbody>
    </table>
</div>

 

Çalıştıralım

Anasayfa:

findAll sayfamız:

findById sayfamız:

 

Heroku’ya Deploy Edelim

Heroku’ya giriş yapıldıktan sonra Apps içerisinde sağ üst menüden New butonuna basalım ve Create New App diyelim.

 

Uygun, kullanılmamış bir isim seçelim ve devam edelim.

Deployment method için Github seçelim devamında da repomuzu seçelim. Connect butonuna basalım.

Deploy etmek için seçili olan branch’ımıza dikkat ederek deploy komutunu verelim.

Bir takım terminal çıktılarından sonra deploy yapıldı bilgisini alacağız ve sitemize giriş yapabiliriz.

 

Sitemize giriş yapalım. (Daha sonraki girişlerinizde tekrar uygulamayı kaldıracağı için ilk açılış biraz uzun sürebilir)

 

More Reading

Post navigation